aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/control/parser/environment.lux
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source/library/lux/control/parser/environment.lux')
-rw-r--r--stdlib/source/library/lux/control/parser/environment.lux44
1 files changed, 44 insertions, 0 deletions
diff --git a/stdlib/source/library/lux/control/parser/environment.lux b/stdlib/source/library/lux/control/parser/environment.lux
new file mode 100644
index 000000000..c0ced37c2
--- /dev/null
+++ b/stdlib/source/library/lux/control/parser/environment.lux
@@ -0,0 +1,44 @@
+(.module:
+ [library
+ [lux #*
+ [control
+ ["." try (#+ Try)]
+ ["." exception (#+ exception:)]]
+ [data
+ ["." product]
+ ["." text
+ ["%" format (#+ format)]]
+ [collection
+ ["." dictionary (#+ Dictionary)]]]]]
+ ["." //])
+
+(type: #export Property
+ Text)
+
+(type: #export Environment
+ (Dictionary Property Text))
+
+(exception: #export (unknown {property Property})
+ (exception.report
+ ["Property" (%.text property)]))
+
+(type: #export (Parser a)
+ (//.Parser Environment a))
+
+(def: #export empty
+ Environment
+ (dictionary.new text.hash))
+
+(def: #export (property name)
+ (-> Text (Parser Text))
+ (function (_ environment)
+ (case (dictionary.get name environment)
+ (#.Some value)
+ (exception.return [environment value])
+
+ #.None
+ (exception.throw ..unknown name))))
+
+(def: #export (run parser environment)
+ (All [a] (-> (Parser a) Environment (Try a)))
+ (\ try.monad map product.right (parser environment)))