module DDC.Source.Tetra.Env
(
primKindEnv
, kindOfPrimName
, primTypeEnv
, typeOfPrimName
, typeOfPrimVal
, typeOfPrimLit
, dataDefBool)
where
import DDC.Source.Tetra.Prim
import DDC.Source.Tetra.Exp
import DDC.Type.DataDef
import DDC.Type.Env (Env)
import qualified DDC.Type.Env as Env
primKindEnv :: Env Name
primKindEnv = Env.setPrimFun kindOfPrimName Env.empty
kindOfPrimName :: Name -> Maybe (Kind Name)
kindOfPrimName nn
= case nn of
NameTyCon tc -> Just $ kindPrimTyCon tc
_ -> Nothing
primTypeEnv :: Env Name
primTypeEnv = Env.setPrimFun typeOfPrimName Env.empty
typeOfPrimName :: Name -> Maybe (Type Name)
typeOfPrimName nn
= case nn of
NameVal n -> Just $ typeOfPrimVal n
_ -> Nothing
typeOfPrimVal :: PrimVal -> Type Name
typeOfPrimVal dc
= case dc of
PrimValLit l -> typeOfPrimLit l
PrimValArith p -> typePrimArith p
PrimValError p -> typeOpError p
PrimValVector p -> typeOpVector p
PrimValFun p -> typeOpFun p
typeOfPrimLit :: PrimLit -> Type Name
typeOfPrimLit pl
= case pl of
PrimLitBool _ -> tBool
PrimLitNat _ -> tNat
PrimLitInt _ -> tInt
PrimLitSize _ -> tSize
PrimLitFloat _ bits -> tFloat bits
PrimLitWord _ bits -> tWord bits
PrimLitTextLit _ -> tTextLit
dataDefBool :: DataDef Name
dataDefBool
= makeDataDefAlg (NameTyCon PrimTyConBool)
[]
(Just [ (NameLitBool True, [])
, (NameLitBool False, []) ])