module DDC.Core.Tetra.Env
( primDataDefs
, primSortEnv
, primKindEnv
, primTypeEnv)
where
import DDC.Core.Tetra.Prim
import DDC.Core.Tetra.Compounds
import DDC.Type.DataDef
import DDC.Type.Exp
import DDC.Type.Env (Env)
import qualified DDC.Type.Env as Env
primDataDefs :: DataDefs Name
primDataDefs
= fromListDataDefs
[ DataDef (NameTyConPrim TyConPrimBool)
[]
(Just [ (NameLitBool True, [])
, (NameLitBool False, []) ])
, DataDef (NameTyConPrim TyConPrimNat) [] Nothing
, DataDef (NameTyConPrim TyConPrimInt) [] Nothing
, DataDef (NameTyConPrim (TyConPrimWord 64)) [] Nothing
, DataDef (NameTyConPrim (TyConPrimWord 32)) [] Nothing
, DataDef (NameTyConPrim (TyConPrimWord 16)) [] Nothing
, DataDef (NameTyConPrim (TyConPrimWord 8)) [] Nothing
, DataDef (NameTyConPrim TyConPrimRef) [] Nothing
]
primSortEnv :: Env Name
primSortEnv = Env.setPrimFun sortOfPrimName Env.empty
sortOfPrimName :: Name -> Maybe (Sort Name)
sortOfPrimName _ = Nothing
primKindEnv :: Env Name
primKindEnv = Env.setPrimFun kindOfPrimName Env.empty
kindOfPrimName :: Name -> Maybe (Kind Name)
kindOfPrimName nn
= case nn of
NameTyConPrim tc -> Just $ kindTyConPrim tc
_ -> Nothing
primTypeEnv :: Env Name
primTypeEnv = Env.setPrimFun typeOfPrimName Env.empty
typeOfPrimName :: Name -> Maybe (Type Name)
typeOfPrimName dc
= case dc of
NameOpPrimArith p -> Just $ typeOpPrimArith p
NameOpPrimRef p -> Just $ typeOpPrimRef p
NameLitBool _ -> Just $ tBool
NameLitNat _ -> Just $ tNat
NameLitInt _ -> Just $ tInt
NameLitWord _ bits -> Just $ tWord bits
_ -> Nothing