/
promise.cljc
74 lines (60 loc) · 1.51 KB
/
promise.cljc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
(ns cats.labs.promise
"A promise monad that uses promesa library."
(:require [cats.core :as m]
[cats.context :as mc]
[cats.protocols :as mp]
[promesa.core :as p]
[promesa.impl :as pi]
[promesa.protocols :as pp])
#?(:clj
(:import java.util.concurrent.CompletableFuture)))
(declare context)
#?(:cljs
(defn extend-promise!
[t]
(extend-type t
mp/Contextual
(-get-context [_] context)
mp/Extract
(-extract [it]
(pp/-extract it)))))
#?(:cljs (extend-promise! pi/*default-promise*))
#?(:clj
(extend-type CompletableFuture
mp/Contextual
(-get-context [_] context)
mp/Extract
(-extract [it]
(pp/-extract it))))
(def ^:no-doc context
(reify
mp/Context
mp/Functor
(-fmap [mn f mv]
(pp/-map mv f))
mp/Bifunctor
(-bimap [_ err succ mv]
(-> mv
(pp/-map succ)
(pp/-thenErr err)))
mp/Monad
(-mreturn [_ v]
(pp/-promise v))
(-mbind [mn mv f]
(pp/-bind mv f))
mp/Applicative
(-pure [_ v]
(pp/-promise v))
(-fapply [_ pf pv]
(pp/-map (p/all [pf pv])
(fn [[f v]]
(f v))))
mp/Semigroup
(-mappend [_ mv mv']
(pp/-map (m/sequence [mv mv'])
(fn [[mvv mvv']]
(let [ctx (mp/-get-context mvv)]
(mp/-mappend ctx mvv mvv')))))))
(def ^:deprecated promise-context
"Deprecated alias for `context`."
context)