   Otherwise, returns the instance unchanged.
 
       (require '[cats.types :as t])
-
-      (filter-m (partial < 2) (t/just 3))
+      (require '[cats.core :as m])
+
+      (m/filter-m (partial < 2) (t/just 3))
       ;=> <Just [3]>
 
-      (filter-m (partial < 4) (t/just 3))
+      (m/filter-m (partial < 4) (t/just 3))
       ;=> <Nothing>
   "
   [p mv]

            (return []))
          mvs))

(def ^{:arglist '([mf vs])}
     map-m (comp sequence-m map))

; TODO: docstring
(defn for-m
  [vs mf]
  (map-m mf vs))


  (>>= mv f))

(defn >=>
  "Left-to-right composition of monads."
  [mf mg x]
  (#+clj  mlet
   #+cljs cm/mlet [a (mf x)
                   b (mg a)]
                  (return b)))

(defn <=<
  "Right-to-left composition of monads.

  Same as `>=>` with its first two arguments flipped."
  [mg mf x]
  (#+clj  mlet
   #+cljs cm/mlet [a (mf x)
                   b (mg a)]
                  (return b)))

(defn sequence-m
  "Given a non-empty collection of monadic values, collect
  their values in a vector returned in the monadic context.

      (require '[cats.types :as t])
      (require '[cats.core :as m])

      (m/sequence-m [(t/just 2) (t/just 3)])
      ;=> <Just [[2, 3]]>

      (m/sequence-m [(t/nothing) (t/just 3)])
      ;=> <Nothing>
  "
  [mvs]
  {:pre [(not-empty mvs)]}
  (reduce (fn [mvs mv]
