packages feed

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 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