Initial commit + basic Expr impl
This commit is contained in:
31
src/Language/Bergamot/Syntax.purs
Normal file
31
src/Language/Bergamot/Syntax.purs
Normal file
@@ -0,0 +1,31 @@
|
||||
module Language.Bergamot.Syntax where
|
||||
|
||||
import Data.List (List)
|
||||
import Data.Functor (class Functor, (<$>))
|
||||
import Data.Eq (class Eq)
|
||||
import Data.Traversable (class Traversable, sequence)
|
||||
import Data.Foldable (class Foldable, foldr, foldl, foldMap)
|
||||
import Data.Monoid ((<>), mempty)
|
||||
|
||||
data Expr v
|
||||
= Var v
|
||||
| Atom String (List (Expr v))
|
||||
|
||||
derive instance Eq v => Eq (Expr v)
|
||||
derive instance Functor Expr
|
||||
|
||||
instance Foldable Expr where
|
||||
foldr f b (Var x) = f x b
|
||||
foldr f b (Atom _ xs) = foldr (\x b' -> foldr f b' x) b xs
|
||||
|
||||
foldl f b (Var x) = f b x
|
||||
foldl f b (Atom _ xs) = foldl (foldl f) b xs
|
||||
|
||||
foldMap f (Var x) = f x
|
||||
foldMap f (Atom _ xs) = foldl (<>) mempty (foldMap f <$> xs)
|
||||
|
||||
instance Traversable Expr where
|
||||
sequence (Var f) = Var <$> f
|
||||
sequence (Atom name fs) = Atom name <$> sequence (sequence <$> fs)
|
||||
|
||||
traverse f e = sequence (f <$> e)
|
||||
6
src/Main.purs
Normal file
6
src/Main.purs
Normal file
@@ -0,0 +1,6 @@
|
||||
module Main where
|
||||
|
||||
import Prelude
|
||||
|
||||
main :: Unit
|
||||
main = unit
|
||||
Reference in New Issue
Block a user