(.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 Codec) {#.doc "Codec composition."} (All [a b c] (-> (Codec c b) (Codec b a) (Codec c a))) (def: encode (|>> (:: Codec encode) (:: Codec encode))) (def: (decode cy) (do e.Monad [by (:: Codec decode cy)] (:: Codec decode by))))