From 4603b8e9b1d2b99b8286c82d55ac18ba00fe7331 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Sun, 5 Feb 2023 20:46:04 +0100 Subject: List expression type --- src/Parser.hs | 14 ++++++++++++++ src/Test.hs | 5 +++++ 2 files changed, 19 insertions(+) (limited to 'src') diff --git a/src/Parser.hs b/src/Parser.hs index b67ce55..51fc0f0 100644 --- a/src/Parser.hs +++ b/src/Parser.hs @@ -208,6 +208,19 @@ regex = label "regular expression" $ lexeme $ do _ <- eval expr -- test regex parsing with empty variables return expr +list :: TestParser SomeExpr +list = label "list" $ do + symbol "[" + SomeExpr x <- someExpr + choice + [do symbol "]" + return $ SomeExpr $ UnOp (:[]) x + ,do symbol "," + xs <- listOf typedExpr + symbol "]" + return $ SomeExpr $ foldr (BinOp (:)) (Literal []) (x:xs) + ] + data SomeExpr = forall a. ExprType a => SomeExpr (Expr a) data SomeUnOp = forall a b. (ExprType a, ExprType b) => SomeUnOp (a -> b) @@ -310,6 +323,7 @@ someExpr = join inner "expression" [ return <$> numberLiteral , return . SomeExpr <$> quotedString , return . SomeExpr <$> regex + , return <$> list ] variable = label "variable" $ do diff --git a/src/Test.hs b/src/Test.hs index b2644b6..b6a85ae 100644 --- a/src/Test.hs +++ b/src/Test.hs @@ -96,6 +96,11 @@ instance ExprType Regex where textExprValue _ = T.pack "" emptyVarValue = either error id $ regexCompile T.empty +instance ExprType a => ExprType [a] where + textExprType _ = "[" <> textExprType @a Proxy <> "]" + textExprValue x = "[" <> T.intercalate ", " (map textExprValue x) <> "]" + emptyVarValue = [] + data SomeVarValue = forall a. ExprType a => SomeVarValue a data RecordSelector a = forall b. ExprType b => RecordSelector (a -> b) -- cgit v1.2.3