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