aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/lux/data/result.lux
blob: 77fd144f97bc529a10ff55417a230cb3ad75dcd0 (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
(;module:
  lux
  (lux (control functor
                applicative
                ["M" monad #*])))

## [Types]
(type: #export (Result a)
  (#Error Text)
  (#Success a))

## [Structures]
(struct: #export _ (Functor Result)
  (def: (map f ma)
    (case ma
      (#Error msg)     (#Error msg)
      (#Success datum) (#Success (f datum)))))

(struct: #export _ (Applicative Result)
  (def: functor Functor<Result>)

  (def: (wrap a)
    (#Success a))

  (def: (apply ff fa)
    (case ff
      (#Success f)
      (case fa
        (#Success a)
        (#Success (f a))

        (#Error msg)
        (#Error msg))

      (#Error msg)
      (#Error msg))
    ))

(struct: #export _ (Monad Result)
  (def: applicative Applicative<Result>)

  (def: (join mma)
    (case mma
      (#Error msg) (#Error msg)
      (#Success ma) ma)))

(struct: #export (ResultT Monad<M>)
  (All [M] (-> (Monad M) (Monad (All [a] (M (Result a))))))
  (def: applicative (compA (get@ #M;applicative Monad<M>) Applicative<Result>))
  (def: (join MeMea)
    (do Monad<M>
      [eMea MeMea]
      (case eMea
        (#Error error)
        (wrap (#Error error))

        (#Success Mea)
        Mea))))

(def: #export (lift Monad<M>)
  (All [M a] (-> (Monad M) (-> (M a) (M (Result a)))))
  (liftM Monad<M> (:: Monad<Result> wrap)))

(def: #export (succeed value)
  (All [a] (-> a (Result a)))
  (#Success value))

(def: #export (fail message)
  (All [a] (-> Text (Result a)))
  (#Error message))