Protocol based Monad library
(require '[emerald.syntax :refer [for-m]])
;; List Monad
(for-m [a '(1 2 3)
:let [x (inc a)]
b '(2 4 6)
:if (even? x)]
[a b])
;; Identity and Maybe
(for-m [a ([1 2 3] 0)
b ({:foo 2 :bar 3} :baz)]
(+ a b))
(require '[emerald.monad :refer [>>=]])
(>>= '(1 2 3) (partial repeat 2))
(>>= 0 inc inc (fn [x] (* x x)))
(require '[emerald.monad :refer [lift]])
(lift + '(1 2 3) '(2 3 4))
(lift + 1 2 nil 3)