aboutsummaryrefslogtreecommitdiff
path: root/source/lux/meta/syntax.lux
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--source/lux/meta/syntax.lux22
1 files changed, 19 insertions, 3 deletions
diff --git a/source/lux/meta/syntax.lux b/source/lux/meta/syntax.lux
index d9f3c6dc3..641dfba0d 100644
--- a/source/lux/meta/syntax.lux
+++ b/source/lux/meta/syntax.lux
@@ -12,7 +12,7 @@
(data (bool #as b)
(char #as c)
(text #as t #open ("text:" Text/Monoid Text/Eq))
- (list #refer #all #open ("" List/Fold))
+ (list #refer #all #open ("" List/Functor List/Fold))
(number (int #open ("i" Int/Ord))
(real #open ("r" Real/Eq))))))
@@ -28,6 +28,10 @@
#;Nil #;Nil
(#;Cons [[x y] pairs']) (@list& x y (join-pairs pairs'))))
+(def (pair->tuple [left right])
+ (-> (, AST AST) AST)
+ (tuple$ (@list left right)))
+
## [Types]
(deftype #export (Parser a)
(-> (List AST) (Maybe (, (List AST) a))))
@@ -163,8 +167,8 @@
(All [a]
(-> (Parser a) (Parser a)))
(case tokens
- (#;Cons [[_ (<tag> form)] tokens'])
- (case (p form)
+ (#;Cons [[_ (<tag> members)] tokens'])
+ (case (p members)
(#;Some [#;Nil x]) (#;Some [tokens' x])
_ #;None)
@@ -175,6 +179,18 @@
[tuple^ #;TupleS]
)
+(def #export (record^ p tokens)
+ (All [a]
+ (-> (Parser a) (Parser a)))
+ (case tokens
+ (#;Cons [[_ (#;RecordS pairs)] tokens'])
+ (case (p (map pair->tuple pairs))
+ (#;Some [#;Nil x]) (#;Some [tokens' x])
+ _ #;None)
+
+ _
+ #;None))
+
(def #export (?^ p tokens)
(All [a]
(-> (Parser a) (Parser (Maybe a))))