Grow (empty) → 1.0
raw patch · 4 files changed
+69/−0 lines, 4 filesdep +arraydep +basedep +bytestring
Dependencies added: array, base, bytestring, clock, containers, deepseq, definitive-base, definitive-filesystem, definitive-parser, directory, filepath, old-locale, primitive, time, unix, vector
Files
- Grow.cabal +18/−0
- Grow.hs +14/−0
- Grow/Syntax.hs +37/−0
- LICENSE +0/−0
+ Grow.cabal view
@@ -0,0 +1,18 @@+name: Grow+version: 1.0++synopsis: A declarative make-like interpreter.+description: +author: Marc Coiffier+maintainer: marc.coiffier@gmail.com+license: PublicDomain++build-type: Simple+cabal-version: >=1.10++library+ exposed-modules: Grow Grow.Syntax+ build-depends: base (== 4.6.*), definitive-base (== 1.0.*), containers (== 0.5.*), deepseq (== 1.3.*), array (== 0.5.*), bytestring (== 0.10.*), definitive-filesystem (== 1.0.*), clock (== 0.4.*), directory (== 1.2.*), filepath (== 1.3.*), time (== 1.4.*), old-locale (== 1.0.*), unix (== 2.7.*), definitive-parser (== 1.0.*), vector (== 0.10.*), primitive (== 0.5.*)+ default-extensions: RebindableSyntax NoMonomorphismRestriction+ ghc-options: + default-language: Haskell2010
+ Grow.hs view
@@ -0,0 +1,14 @@+{-# LANGUAGE RebindableSyntax, NoMonomorphismRestriction, FlexibleInstances, MultiParamTypeClasses, UndecidableInstances #-}+module Grow where++import Algebra+import IO.Filesystem+import qualified Prelude as P+import Algebra.Parser+import Grow.Syntax++pureVal :: SyntaxT Id -> SyntaxT Id+pureVal = id++main :: IO ()+main = print =<< (P.readFile "Seed" <&> map2 pureVal growExpr^..parser)
+ Grow/Syntax.hs view
@@ -0,0 +1,37 @@+{-# 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))+
+ LICENSE view