aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/abstract/codec.lux
blob: 6c0cc0a12d121f67232df085de8ae03a73a18373 (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
(.using
 [library
  [lux (.except)
   [control
    ["[0]" try (.only Try)]]]]
 [//
  [monad (.only do)]
  ["[0]" functor]])

(type: .public (Codec m a)
  (Interface
   (is (-> a m)
       encoded)
   (is (-> 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))))