aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/lux/control/codec.lux
blob: 55095ee3c55106a7d7d8e8a14bb71a18a569f8bf (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
(;module:
  lux
  (lux (control monad)
       (data ["E" error])))

## [Signatures]
(sig: #export (Codec m a)
  {#;doc "A way to move back-and-forth between a type and an alternative representation for it."}
  (: (-> a m)
     encode)
  (: (-> m (E;Error a))
     decode))

## [Values]
(struct: #export (compose Codec<c,b> Codec<b,a>)
  {#;doc "Codec composition."}
  (All [a b c]
    (-> (Codec c b) (Codec b a)
        (Codec c a)))
  (def: encode
    (|>. (:: Codec<b,a> encode)
         (:: Codec<c,b> encode)))

  (def: (decode cy)
    (do E;Monad<Error>
      [by (:: Codec<c,b> decode cy)]
      (:: Codec<b,a> decode by)))
  )