   "The maybe transformer constructor."
   [inner-monad]
   (reify
-    proto/Functor
+    p/Functor
     (fmap [_ f fv]
-      (proto/fmap inner-monad
-                  #(proto/fmap maybe-monad f %)
-                  fv))
-
-    proto/Monad
+      (p/fmap inner-monad
+              #(p/fmap maybe-monad f %)
+              fv))
+
+    p/Monad
     (mreturn [m v]
-      (proto/mreturn inner-monad (just v)))
+      (p/mreturn inner-monad (just v)))
 
     (mbind [_ mv f]
-      (proto/mbind inner-monad
-                   mv
-                   (fn [maybe-v]
-                     (if (just? maybe-v)
-                       (f (from-maybe maybe-v))
-                       (proto/mreturn inner-monad (nothing))))))
-
-    proto/MonadZero
+      (p/mbind inner-monad
+               mv
+               (fn [maybe-v]
+                 (if (just? maybe-v)
+                   (f (from-maybe maybe-v))
+                   (p/mreturn inner-monad (nothing))))))
+
+    p/MonadZero
     (mzero [_]
-      (proto/mreturn inner-monad (nothing)))
-
-    proto/MonadPlus
+      (p/mreturn inner-monad (nothing)))
+
+    p/MonadPlus
     (mplus [_ mv mv']
-      (proto/mbind inner-monad
-                   mv
-                   (fn [maybe-v]
-                     (if (just? maybe-v)
-                       (proto/mreturn inner-monad maybe-v)
-                       mv'))))
-
-    proto/MonadTrans
+      (p/mbind inner-monad
+               mv
+               (fn [maybe-v]
+                 (if (just? maybe-v)
+                   (p/mreturn inner-monad maybe-v)
+                   mv'))))
+
+    p/MonadTrans
     (base [_]
       maybe-monad)
 

      (maybe/just 1)
      ;; => #<Just [1]>
  "
  (:require [cats.protocols :as proto]
            [cats.core :as m]))

(declare maybe-monad)

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

(deftype Just [v]
  p/Context
  (get-context [_] maybe-monad)

  p/Extract
  (extract [_] v)

  #?(:clj clojure.lang.IDeref
