From 0a8c190d0025612b5e25cb2dc4910a9b1ae280b6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alejandro=20G=C3=B3mez?= <alejandro@dialelo.com>
Date: Sat, 15 Aug 2015 12:37:19 +0200
Subject: [PATCH] WIP: applicative instance for maybe transformer

---
 src/cats/monad/maybe.cljc       | 19 +++++++++++++++++++
 test/cats/monad/maybe_spec.cljc | 12 ++++++++++++
 2 files changed, 31 insertions(+)

diff --git a/src/cats/monad/maybe.cljc b/src/cats/monad/maybe.cljc
index 8251f49..08e1305 100644
--- a/src/cats/monad/maybe.cljc
+++ b/src/cats/monad/maybe.cljc
@@ -235,6 +235,25 @@
               #(p/fmap maybe-monad f %)
               fv))
 
+    p/Applicative
+    (pure [_ v]
+      (p/mreturn inner-monad (just v)))
+
+    (fapply [_ af av]
+      (p/mbind inner-monad
+               af
+               (fn [mf]
+                 (p/mbind maybe-monad
+                          mf
+                          (fn [f]
+                            (p/mbind inner-monad
+                                     av
+                                     (fn [mv]
+                                       (p/mbind maybe-monad
+                                                mv
+                                                (fn [v]
+                                                  (p/mreturn inner-monad (just (f v))))))))))))
+
     p/Monad
     (mreturn [m v]
       (p/mreturn inner-monad (just v)))
diff --git a/test/cats/monad/maybe_spec.cljc b/test/cats/monad/maybe_spec.cljc
index 622f1f5..f490a8a 100644
--- a/test/cats/monad/maybe_spec.cljc
+++ b/test/cats/monad/maybe_spec.cljc
@@ -72,6 +72,18 @@
              (m/with-monad maybe-vector-transformer
                (m/return 2))))
 
+    (t/is (= [(maybe/just 42)]
+             (m/with-monad maybe-vector-transformer
+               (m/fapply [(maybe/just inc)] [(maybe/just 41)]))))
+
+    (t/is (= [(maybe/just 42)
+              (maybe/just 99)
+              (maybe/just "41")
+              (maybe/just "98")]
+             (m/with-monad maybe-vector-transformer
+               (m/fapply [(maybe/just inc) (maybe/just str)]
+                         [(maybe/just 41) (maybe/just 98)]))))
+
     (t/is (= [(maybe/just 1)
               (maybe/just 2)
               (maybe/just 2)