blob: abe80ba4aca52ba944faff1d77c4cae1e4647ad1 (
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
|
(.module:
[lux #*
[data
["." error (#+ Error)]]]
[//
monad])
(signature: #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 (Error a))
decode))
(structure: #export (compose cb-codec ba-codec)
{#.doc "Codec composition."}
(All [a b c]
(-> (Codec c b) (Codec b a)
(Codec c a)))
(def: encode
(|>> (:: ba-codec encode)
(:: cb-codec encode)))
(def: (decode cy)
(do error.monad
[by (:: cb-codec decode cy)]
(:: ba-codec decode by))))
|