diff options
Diffstat (limited to 'stdlib/source/lux/control/parser.lux')
-rw-r--r-- | stdlib/source/lux/control/parser.lux | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/stdlib/source/lux/control/parser.lux b/stdlib/source/lux/control/parser.lux index e2c522188..0c1b2cf32 100644 --- a/stdlib/source/lux/control/parser.lux +++ b/stdlib/source/lux/control/parser.lux @@ -2,7 +2,8 @@ [lux #- not default] (lux (control functor applicative - ["M" monad #+ do Monad]) + ["M" monad #+ do Monad] + [codec]) (data (coll [list "L/" Functor<List> Monoid<List>]) [product] ["R" result]))) @@ -246,3 +247,18 @@ [output parser _ (assert "Constraint failed." (test output))] (wrap output))) + +(def: #export (codec Codec<a,z> parser) + (All [s a z] (-> (codec;Codec a z) (Parser s a) (Parser s z))) + (function [input] + (case (parser input) + (#R;Error error) + (#R;Error error) + + (#R;Success [input' to-decode]) + (case (:: Codec<a,z> decode to-decode) + (#R;Error error) + (#R;Error error) + + (#R;Success value) + (#R;Success [input' value]))))) |