 ;;make youself a do notation
 
 (def list-m {:return (fn [v] (list v))
-             :>>=   (fn [mv f]
+             :>>=    (fn [mv f]
                        (mapcat f mv))})
 
 (let [bind (:>>= list-m)

  (if (seq bindings)
    `(-> ~val
         ((:>>= ~m) (fn [~name]
                       ~(m-steps m (vec bindings) body))))
    `(-> ~val
         ((:>>= ~m) (fn [~name]
                       ((:return ~m) ~body))))))

(defmacro do-m [m bindings body]
  (m-steps m bindings body))

;;(add 1 nil)                                                 ;;CompilerException java.lang.NullPointerException

(def monad-maybe {:return (fn [v] v)
                  :>>=    (fn [mv f]
                            (when mv
                              (f mv)))})

