   [e]
   {:pre [(either? e)]}
   (if (left? e)
-    (right (m/extract e))
-    (left (m/extract e))))
+    (right (proto/extract e))
+    (left (proto/extract e))))


(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 (m/extract e))
    (rf (m/extract e))))

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

  either is a left, return it."
  [e rf]
  {:pre [(either? e)]}
  (let [context either-monad]
    (proto/mbind context e rf)))

(def lefts
  "Given a collection of eithers, return only the values that are left."
