aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/lux/data/format/context.lux
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source/lux/data/format/context.lux')
-rw-r--r--stdlib/source/lux/data/format/context.lux34
1 files changed, 34 insertions, 0 deletions
diff --git a/stdlib/source/lux/data/format/context.lux b/stdlib/source/lux/data/format/context.lux
new file mode 100644
index 000000000..a515052c6
--- /dev/null
+++ b/stdlib/source/lux/data/format/context.lux
@@ -0,0 +1,34 @@
+(;module:
+ lux
+ (lux (control ["p" parser]
+ ["ex" exception #+ exception:]
+ [monad #+ do])
+ (data ["R" result]
+ (coll ["d" dict]))))
+
+(exception: #export Unknown-Property)
+
+(type: #export Context
+ (d;Dict Text Text))
+
+(type: #export (Property a)
+ (p;Parser Context a))
+
+(def: #export (property name)
+ (-> Text (Property Text))
+ (function [context]
+ (case (d;get name context)
+ (#;Some value)
+ (ex;return [context value])
+
+ #;None
+ (ex;throw Unknown-Property name))))
+
+(def: #export (run context property)
+ (All [a] (-> Context (Property a) (R;Result a)))
+ (case (property context)
+ (#R;Success [_ output])
+ (#R;Success output)
+
+ (#R;Error error)
+ (#R;Error error)))