 (alter-meta! #'->Identity assoc :private true)
 
 (defn identity
-  "Default constructor for identity type."
+  "The Identity type constructor."
   [v]
   (Identity. v))
 

;; Monad definition
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(def identity-monad
  (reify
    proto/Functor
    (fmap [_ f iv]

;; Monad transformer definition
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defn identity-transformer
  "The Identity transformer constructor."
  [inner-monad]
  (reify
    proto/Monad
    (mreturn [_ v]
      (identity (proto/mreturn inner-monad v)))

    (mbind [_ mv f]
      nil)))
