(;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))) )