aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/lux/abstract/codec.lux
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))))