blob: 638e11519d2c077dc4d0e867391025ba90187137 (
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
|
(.module:
[lux #*
["." io]
[control
[monad (#+ do)]
pipe
["&" reader]]]
lux/test)
(context: "Readers"
(let [(^open "&/.") &.apply
(^open "&/.") &.monad]
($_ seq
(test "" (i/= +123 (&.run +123 &.ask)))
(test "" (i/= +246 (&.run +123 (&.local (i/* +2) &.ask))))
(test "" (i/= +134 (&.run +123 (&/map inc (i/+ +10)))))
(test "" (i/= +10 (&.run +123 (&/wrap +10))))
(test "" (i/= +30 (&.run +123 (&/apply (&/wrap (i/+ +10)) (&/wrap +20)))))
(test "" (i/= +30 (&.run +123 (do &.monad
[f (wrap i/+)
x (wrap +10)
y (wrap +20)]
(wrap (f x y)))))))))
(context: "Monad transformer"
(let [(^open "io/.") io.monad]
(test "Can add reader functionality to any monad."
(|> (: (&.Reader Text (io.IO Int))
(do (&.ReaderT io.monad)
[a (&.lift (io/wrap +123))
b (wrap +456)]
(wrap (i/+ a b))))
(&.run "")
io.run
(case> +579 #1
_ #0)))
))
|