blob: c30494e5643eb3430f93378a3fa5c020b667bb12 (
plain)
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
75
76
77
78
79
80
81
|
(.module:
[library
[lux "*"
["@" target]
[abstract
[monoid {"+" [Monoid]}]
[apply {"+" [Apply]}]
["[0]" functor {"+" [Functor]}]
["[0]" monad {"+" [Monad do]}]]]])
(type: .public (Writer log value)
(Record
[#log log
#value value]))
(def: .public (write message)
(All (_ log) (-> log (Writer log Any)))
[message []])
(implementation: .public functor
(All (_ l)
(Functor (Writer l)))
(def: (each f fa)
(let [[log datum] fa]
[log (f datum)])))
(implementation: .public (apply monoid)
(All (_ l)
(-> (Monoid l) (Apply (Writer l))))
(def: &functor ..functor)
(def: (on fa ff)
(let [[log1 f] ff
[log2 a] fa]
[(\ monoid composite log1 log2) (f a)])))
(implementation: .public (monad monoid)
(All (_ l)
(-> (Monoid l) (Monad (Writer l))))
(def: &functor ..functor)
(def: in
(|>> [(\ monoid identity)]))
(def: (conjoint mma)
(let [[log1 [log2 a]] mma]
[(\ monoid composite log1 log2) a])))
(implementation: .public (with monoid monad)
(All (_ l M) (-> (Monoid l) (Monad M) (Monad (All (_ a) (M (Writer l a))))))
(def: &functor
(functor.composite (value@ monad.&functor monad)
..functor))
(def: in
(let [writer (..monad monoid)]
(|>> (\ writer in) (\ monad in))))
(def: (conjoint MlMla)
(do monad
[[l1 Mla] (for [@.old
(: {.#Apply (Writer (:parameter 0)
{.#Apply (Writer (:parameter 0)
(:parameter 2))
(:parameter 1)})
(:parameter 1)}
MlMla)]
... On new compiler
MlMla)
[l2 a] Mla]
(in [(\ monoid composite l1 l2) a]))))
(def: .public (lifted monoid monad)
(All (_ l M a)
(-> (Monoid l) (Monad M)
(-> (M a) (M (Writer l a)))))
(\ monad each (|>> [(\ monoid identity)])))
|