aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/lux/control/parser.lux
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source/lux/control/parser.lux')
-rw-r--r--stdlib/source/lux/control/parser.lux18
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])))))