blob: 95ee39d91ec0426be39d631f2fcded3bc29d5e4e (
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
|
(.module:
[lux #*
["." io ("io/." Monad<IO>)]
[control
["M" monad (#+ do Monad)]
pipe]
[data
["&" maybe ("&/." Monoid<Maybe>)]
["." text ("text/." Monoid<Text>)]]]
lux/test)
(context: "Maybe"
(let [(^open "&/.") &.Apply<Maybe>
(^open "&/.") &.Monad<Maybe>
(^open "&/.") (&.Equivalence<Maybe> text.Equivalence<Text>)]
($_ seq
(test "Can compare Maybe values."
(and (&/= #.None #.None)
(&/= (#.Some "yolo") (#.Some "yolo"))
(not (&/= (#.Some "yolo") (#.Some "lol")))
(not (&/= (#.Some "yolo") #.None))))
(test "Monoid respects Maybe."
(and (&/= #.None &/identity)
(&/= (#.Some "yolo") (&/compose (#.Some "yolo") (#.Some "lol")))
(&/= (#.Some "yolo") (&/compose (#.Some "yolo") #.None))
(&/= (#.Some "lol") (&/compose #.None (#.Some "lol")))
(&/= #.None (: (Maybe Text) (&/compose #.None #.None)))))
(test "Functor respects Maybe."
(and (&/= #.None (&/map (text/compose "yolo") #.None))
(&/= (#.Some "yololol") (&/map (text/compose "yolo") (#.Some "lol")))))
(test "Apply respects Maybe."
(and (&/= (#.Some "yolo") (&/wrap "yolo"))
(&/= (#.Some "yololol")
(&/apply (&/wrap (text/compose "yolo")) (&/wrap "lol")))))
(test "Monad respects Maybe."
(&/= (#.Some "yololol")
(do &.Monad<Maybe>
[f (wrap text/compose)
a (wrap "yolo")
b (wrap "lol")]
(wrap (f a b)))))
)))
(context: "Monad transformer"
(let [lift (&.lift io.Monad<IO>)]
(test "Can add maybe functionality to any monad."
(|> (io.run (do (&.MaybeT io.Monad<IO>)
[a (lift (io/wrap 123))
b (wrap 456)]
(wrap (i/+ a b))))
(case> (#.Some 579) #1
_ #0)))))
|