    (fn [bv]
      (bimap f g bv)))
   ([f g bv]
-   (let [ctx (ctx/get-current bv)]
+   (let [ctx (ctx/infer bv)]
      (ctx/with-context ctx
        (p/-bimap ctx f g bv)))))
 

   (fn [fv]
     (fmap f fv)))
  ([f fv]
   (let [ctx (ctx/get-current fv)]
     (ctx/with-context ctx
       (p/-fmap ctx f fv)))))


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defn mempty
  ([] (p/-mempty (ctx/infer)))
  ([ctx] (p/-mempty ctx)))

(defn mappend
  [& svs]
  {:pre [(seq svs)]}
  (let [ctx (ctx/infer (first svs))]
    (reduce (partial p/-mappend ctx) svs)))

(defn pure
