aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/abstract/codec.lux
blob: 57d280fbb8e1253386e098cf1884c5a4f6a100c6 (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:
  [library
   [lux "*"
    [control
     ["[0]" try {"+" Try}]]]]
  [//
   [monad {"+" do}]
   ["[0]" functor]])

(type: .public (Codec m a)
  (Interface
   (: (-> a m)
      encoded)
   (: (-> m (Try a))
      decoded)))

(implementation: .public (composite cb_codec ba_codec)
  (All (_ a b c)
    (-> (Codec c b) (Codec b a)
        (Codec c a)))
  (def: encoded
    (|>> (# ba_codec encoded)
         (# cb_codec encoded)))

  (def: (decoded cy)
    (do try.monad
      [by (# cb_codec decoded cy)]
      (# ba_codec decoded by))))