{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, UndecidableInstances #-} module Grow.Syntax( module Data.Syntax, growExpr ) where import Algebra import Algebra.Parser import Data.Containers import Data.Syntax import Data.Char instance MonadReader a Id where ask = pure undefined local _ = id growExpr :: Parser String [SyntaxT Id] growExpr = free expr `sepBy1` free (single ';') where decl = (,)<$>symbol<*>(free (single '=') >> free expr) free = (many space >> ) symbol = many1 (satisfy symChar) where symChar c = isAlphaNum c || (c`elem`"/+-_~%*!") funAp = (atom`sepBy1`spaces) <&> ValList . map pure expr = chainr funAp (op <$> free (single ':' >> (atom <* space))) funAp where op f a b = ValList [pure f,pure a,pure b] atom = between (single '(') (free $ single ')') (free inParen) + list + dictionary + (Text<$>symbol) + dollar where dollar = single '$' >> (atom <&> \e -> ValList [pure $ Text "$",pure e]) inParen = Function . lambdaSum<$>(free abstract`sepBy`free (single '|')) <+> expr abstract = lambda<$>atom<*>free (several "~>")*>free expr list = funcall (pure $ Function id).pure.ValList . map pure <$>between (single '[') (free $ single ']') (free expr`sepBy`free (single ',')) dictionary = mkDict<$>between (single '{') (free $ single '}') (free decl`sepBy`free (single ',')) mkDict = Dictionary . fromList . map (\(s,v) -> (s,pure v))