   wrapped computation and return Pair
   instance with result and new state.
 
-  (def computation (mlet [x (get-state)
-                          y (put-state (inc x))]
-                     (return y)))
-
-  (def initial-state 1)
-  (run-state computation initial-state)
+    (def computation (mlet [x (get-state)
+                            y (put-state (inc x))]
+                       (return y)))
+
+    (def initial-state 1)
+    (run-state computation initial-state)
 
   This should be return something to: #<Pair [1 2]>"
   [state seed]

  [af av]
  (p/fapply af av))

(defn >>=
  "Performs a Haskell-style left-associative bind."
  ([mv f]
     (bind mv f))
  ([mv f & fs]
     (reduce bind mv (cons f fs))))

(defn <$>
  "Alias of fmap."
  ([f]
     (fn [fv]
       (p/fmap fv f)))
  ([f fv]
     (p/fmap fv f)))

(defn <*>
  "Performs a Haskell-style left-associative fapply."
  ([af av]
     (p/fapply af av))
  ([af av & avs]
     (reduce p/fapply af (cons av avs))))

#+clj
(defmacro mlet

  #+cljs
  (:require-macros [cats.core :as cm]))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Context Management
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(def ^:dynamic *m-context*)

