   "Given a non-empty collection of monadic values, collect
   their values in a vector returned in the monadic context.
 
-      (require '[cats.monad.maybe :as maybe])
-      (require '[cats.core :as m])
-
-      (m/sequence [(maybe/just 2) (maybe/just 3)])
-      ;=> <Just [[2, 3]]>
-
-      (m/sequence [(maybe/nothing) (maybe/just 3)])
-      ;=> <Nothing>
+      (sequence [(maybe/just 2) (maybe/just 3)])
+      ;; => <Just [[2, 3]]>
+
+      (sequence [(maybe/nothing) (maybe/just 3)])
+      ;; => <Nothing>
   "
   [mvs]
   {:pre [(not-empty mvs)]}

   (reduce fapply af (cons av avs))))

(defn >>=
  "Performs a Haskell-style left-associative bind.

  Example:
    (>>= (just 1) (comp just inc) (comp just inc))
    ;=> #<Just [3]>
  "
  ([mv f]
   (bind mv f))

(defn forseq
  "Same as mapseq but with the arguments in reverse order.

  Let se a little example:

      (m/forseq [2 3] maybe/just)
      ;; => <Just [[2 3]]>

  Yet an other example that fails:

      (m/forseq [1 2]
                (fn [v]
                  (if (odd? v)
                    (maybe/just v)
                    (maybe/nothing))))
      ;; => <Nothing>
  "
  [vs mf]
  (mapseq mf vs))
