module Core.Grammar (CoreExpr(..),
                     Expr(..),
                     Name,
                     CoreAlt(..),
                     Alter(..),
                     CoreProgram(..),
                     Program(..),
                     CoreScDefn(..),
                     ScDefn(..)) where

-- | AST of the Core language
data Expr a = EVar Name -- ^ a variable
            | ENum Int -- ^ an Int
            | EConstr Int Int [Expr a] -- ^ a type declaration
            | EAp (Expr a) (Expr a) -- ^ function application
            | ELet Bool [(a, Expr a)] (Expr a) -- ^ let/letrec expression
            | ECase (Expr a) [Alter a] -- ^ case expression
            | ELam [a] (Expr a) -- ^ lambda expression (not yet implemented)
            deriving (Show, Eq)

-- | A Core expression
type CoreExpr = Expr Name


type Name = String

-- | a case alternative for a given datatype
-- contains the datatype id
-- a list of local variable names
-- the expression that the case evaluates to
type Alter a = (Int 
               ,[a] 
               , Expr a 
               )

-- | a case alternative
type CoreAlt = Alter Name

-- | a list of supercombinator definitions
type Program a = [ScDefn a]

-- | A list of super combinator definitions
type CoreProgram = Program Name

-- | contains the name of the function/global
-- the list of local variable names
-- the expression the supercombinator evaluates to
type ScDefn a = (Name 
               ,[a] 
               , Expr a 
               )

-- | A supercombinator definition
type CoreScDefn = ScDefn Name