FerryCore-0.4.5: src/Database/Ferry/Core/Data/Core.hs
{-| Untyped core data type -}
{-# LANGUAGE GADTs #-}
module Database.Ferry.Core.Data.Core where
import Database.Ferry.Common.Data.Base
-- | An identifier is represented by a string
type Ident = String
-- | Operator constructor
data Op where
Op :: String -> Op
-- | Datatype for building untyped core ASTs
data CoreExpr where
BinOp :: Op -> CoreExpr -> CoreExpr -> CoreExpr
-- UnaOp :: Op -> CoreExpr -> CoreExpr
Constant :: Const -> CoreExpr
Var :: String -> CoreExpr
App :: CoreExpr -> Param -> CoreExpr
Let :: String -> CoreExpr -> CoreExpr -> CoreExpr
Rec :: [RecElem] -> CoreExpr
Cons :: CoreExpr -> CoreExpr -> CoreExpr
Nil :: CoreExpr
Elem :: CoreExpr -> String -> CoreExpr
Table :: String -> [Column] -> [Key] -> CoreExpr
If :: CoreExpr -> CoreExpr -> CoreExpr -> CoreExpr
-- | Record elements
data RecElem where
RecElem :: String -> CoreExpr -> RecElem
-- | Function arguments
-- In future, that is when defunctionalisation is implemented function arguments should just be expressions.
data Param where
ParExpr :: CoreExpr -> Param
ParAbstr :: [String] -> CoreExpr -> Param
{-
-- | Patterns
data Pattern where
PVar :: String -> Pattern
Pattern :: [String] -> Pattern
-}
-- | Database table column
data Column where
Column :: String -> Type -> Column
-- | Database column type
data Type
= TInt
| TFloat
| TString
| TBool
| TUnit
-- | Database table key
data Key where
Key :: [String] -> Key