aboutsummaryrefslogtreecommitdiff
path: root/stdlib/test/test/lux/control/reader.lux
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)))
    ))