   either is a left, return it."
   [e rf]
   {:pre [(either? e)]}
-  (m/bind e rf))
+  (let [context either-monad]
+    (proto/mbind context e rf)))
 
 (def lefts
   "Given a collection of eithers, return only the values that are left."

      (either/left 1)
      ;; => #<Left [1]>
  "
  (:require [cats.protocols :as proto]
            [cats.core :as m]))

(declare either-monad)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Type constructor and functions
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(deftype Right [v]
  proto/Context


(defn branch
  "Given an either value and two functions, if the either is a
  left apply the first function to the value it contains; if the
  either is a right apply the second function to its value."
  [e lf rf]
  {:pre [(either? e)]}
  (if (left? e)
    (lf (proto/extract e))
    (rf (proto/extract e))))

(defn branch-left
  "Given an either value and a function, if the either is a
