module Ivory.Language.Type where
import Ivory.Language.Proxy
import qualified Ivory.Language.Syntax as AST
class IvoryType t where
ivoryType :: Proxy t -> AST.Type
instance IvoryType () where
ivoryType _ = AST.TyVoid
class IvoryType t => IvoryVar t where
wrapVar :: AST.Var -> t
unwrapExpr :: t -> AST.Expr
class IvoryVar t => IvoryExpr t where
wrapExpr :: AST.Expr -> t
wrapVarExpr :: IvoryExpr t => AST.Var -> t
wrapVarExpr = wrapExpr . AST.ExpVar
typedExpr :: forall t. IvoryVar t => t -> AST.Typed AST.Expr
typedExpr t = AST.Typed
{ AST.tType = ivoryType (Proxy :: Proxy t)
, AST.tValue = unwrapExpr t
}
exprBinop :: IvoryExpr a => (AST.Expr -> AST.Expr -> AST.Expr) -> (a -> a -> a)
exprBinop k x y = wrapExpr (k (unwrapExpr x) (unwrapExpr y))
exprUnary :: IvoryExpr a => (AST.Expr -> AST.Expr) -> (a -> a)
exprUnary k x = wrapExpr (k (unwrapExpr x))
data OpaqueType = OpaqueType
instance IvoryType OpaqueType where
ivoryType _ = AST.TyOpaque