module DDC.Core.Salt.Compounds.PrimTyCon
( tVoid, tBool, tNat, tInt, tSize, tWord, tFloat
, tAddr
, tPtr, takeTPtr
, tTextLit
, tTag
, tObj)
where
import DDC.Core.Salt.Name
import DDC.Core.Exp.Annot
tVoid, tBool, tNat, tInt, tSize, tTag, tAddr, tTextLit :: Type Name
tVoid = TCon (TyConBound (UPrim (NamePrimTyCon PrimTyConVoid) kData) kData)
tBool = TCon (TyConBound (UPrim (NamePrimTyCon PrimTyConBool) kData) kData)
tNat = TCon (TyConBound (UPrim (NamePrimTyCon PrimTyConNat) kData) kData)
tInt = TCon (TyConBound (UPrim (NamePrimTyCon PrimTyConInt) kData) kData)
tSize = TCon (TyConBound (UPrim (NamePrimTyCon PrimTyConSize) kData) kData)
tAddr = TCon (TyConBound (UPrim (NamePrimTyCon PrimTyConAddr) kData) kData)
tTag = TCon (TyConBound (UPrim (NamePrimTyCon PrimTyConTag) kData) kData)
tTextLit = TCon (TyConBound (UPrim (NamePrimTyCon PrimTyConTextLit) kData) kData)
tWord :: Int -> Type Name
tWord bits = TCon (TyConBound (UPrim (NamePrimTyCon (PrimTyConWord bits)) kData) kData)
tFloat :: Int -> Type Name
tFloat bits = TCon (TyConBound (UPrim (NamePrimTyCon (PrimTyConFloat bits)) kData) kData)
tPtr :: Region Name -> Type Name -> Type Name
tPtr r t = TApp (TApp (TCon tcPtr) r) t
where tcPtr = TyConBound (UPrim (NamePrimTyCon PrimTyConPtr) kPtr) kPtr
kPtr = kRegion `kFun` kData `kFun` kData
takeTPtr :: Type Name -> Maybe (Region Name, Type Name)
takeTPtr tt
= case tt of
TApp (TApp (TCon tc) r) t
| TyConBound (UPrim (NamePrimTyCon PrimTyConPtr) _) _ <- tc
-> Just (r, t)
_ -> Nothing
tObj :: Type Name
tObj = TCon (TyConBound (UPrim NameObjTyCon kData) kData)