       (pure either/context 1)
       ;; => #<Right [1]>
   "
-  ([v] (pure (ctx/get-current) v))
+  ([v] (pure (ctx/infer) v))
   ([ctx v] (p/-pure ctx v)))
 
 (defn return
   "This is a monad version of `pure` and works
   identically to it."
-  ([v] (return (ctx/get-current) v))
+  ([v] (return (ctx/infer) v))
   ([ctx v] (p/-mreturn ctx v)))
 
 (defn bind

  [mvs]
  (if (empty? mvs)
    (return ())
    (let [ctx (ctx/get-current (first mvs))]
      (ctx/with-context ctx
        (reduce (fn [mvs mv]
                  (mlet [v mv

  "Right-to-left composition of monads.
  Same as `>=>` with its first two arguments flipped."
  [mg mf x]
  (ctx/with-context (ctx/infer mf)
    (mlet [a (mf x)
           b (mg a)]
      (return b))))
