---------------------------------------------------------------------------
-- * Parser
---------------------------------------------------------------------------

data Program = Program [Def]

data Def = DSig Ident Type | DBind Bind

data Bind = Bind Ident [Ident] Exp

data Exp
    = EId Ident
    | ELit Lit
    | EAnn Exp Type
    | ELet Ident Exp Exp
    | EApp Exp Exp
    | EAdd Exp Exp
    | EAbs Ident Exp

data Lit = LInt Integer 
         | LChar Character

data Type
    = TLit Ident      -- τ
    | TVar TVar       -- α
    | TFun Type Type  -- A → A
    | TAll TVar Type  -- ∀α. A
    | TEVar TEVar     -- ά (internal)

data TVar = MkTVar Ident
data TEVar = MkTEVar Ident

---------------------------------------------------------------------------
-- * Type checker
---------------------------------------------------------------------------

-- • Def and DSig are removed in favor on just Bind 
-- • Typed expressions
-- • TEVar is removed (NOT IMPLEMENTED)

newtype Program = Program [Bind]

data Bind = Bind Id [Id] ExpT

data Exp
    = EId  Ident
    | ELit Lit
    | ELet Bind ExpT
    | EApp ExpT ExpT
    | EAdd ExpT ExpT
    | EAbs Ident ExpT

type Id  = (Ident, Type)
type ExpT = (Exp, Type)


data Lit = LInt Integer 
         | LChar Character

data Type
    = TLit Ident      -- τ
    | TVar TVar       -- α
    | TFun Type Type  -- A → A
    | TAll TVar Type  -- ∀α. A

data TVar = MkTVar Ident

---------------------------------------------------------------------------
-- * Lambda lifter
---------------------------------------------------------------------------
--  • EAbs are removed (NOT IMPLEMENTED)
--  • ELet only allow constant expressions (NOT IMPLEMENTED)

newtype Program = Program [Bind]

data Bind = Bind Id [Id] ExpT

data Exp
    = EId  Ident
    | ELit Lit
    | ELet Ident ExpT ExpT 
    | EApp ExpT ExpT
    | EAdd ExpT ExpT

type Id  = (Ident, Type)
type ExpT = (Exp, Type)

data Lit = LInt Integer 
         | LChar Character

data Type
    = TLit Ident      -- τ
    | TVar TVar       -- α
    | TFun Type Type  -- A → A
    | TAll TVar Type  -- ∀α. A

data TVar = MkTVar Ident

---------------------------------------------------------------------------
-- * Monomorpher
---------------------------------------------------------------------------
--  • Polymorphic types are removed (NOT IMPLEMENTED)

newtype Program = Program [Bind]

data Bind = Bind Id [Id] ExpT

data Exp
    = EId  Ident
    | ELit Lit
    | ELet Ident ExpT ExpT 
    | EApp ExpT ExpT
    | EAdd ExpT ExpT

type Id  = (Ident, Type)
type ExpT = (Exp, Type)

data Lit = LInt Integer 
         | LChar Character

data Type = Type Ident
