module DDC.Core.Tetra.Prim.TyConPrim
( PrimTyCon (..)
, pprPrimTyConStem
, readPrimTyCon, readPrimTyConStem
, kindPrimTyCon
, tVoid
, tBool
, tNat, tInt, tSize, tWord, tFloat
, tPtr
, tTextLit)
where
import DDC.Core.Tetra.Prim.Base
import DDC.Core.Exp.Annot.Compounds
import DDC.Core.Exp.Simple.Exp
import DDC.Core.Salt.Name
( pprPrimTyConStem
, readPrimTyCon, readPrimTyConStem)
kindPrimTyCon :: PrimTyCon -> Kind Name
kindPrimTyCon tc
= case tc of
PrimTyConVoid -> kData
PrimTyConBool -> kData
PrimTyConNat -> kData
PrimTyConInt -> kData
PrimTyConSize -> kData
PrimTyConWord{} -> kData
PrimTyConFloat{} -> kData
PrimTyConVec{} -> kData `kFun` kData
PrimTyConAddr{} -> kData
PrimTyConPtr{} -> kRegion `kFun` kData `kFun` kData
PrimTyConTextLit{} -> kData
PrimTyConTag{} -> kData
tVoid :: Type Name
tVoid = tConPrim PrimTyConVoid
tBool :: Type Name
tBool = tConPrim PrimTyConBool
tNat :: Type Name
tNat = tConPrim PrimTyConNat
tInt :: Type Name
tInt = tConPrim PrimTyConInt
tWord :: Int -> Type Name
tWord bits = tConPrim (PrimTyConWord bits)
tSize :: Type Name
tSize = tConPrim PrimTyConSize
tFloat :: Int -> Type Name
tFloat bits = tConPrim (PrimTyConFloat bits)
tPtr :: Type Name -> Type Name -> Type Name
tPtr r a
= tConPrim PrimTyConPtr `TApp` r `TApp` a
tTextLit :: Type Name
tTextLit = tConPrim PrimTyConTextLit
tConPrim :: PrimTyCon -> Type Name
tConPrim tc
= let k = kindPrimTyCon tc
in TCon (TyConBound (UPrim (NamePrimTyCon tc) k) k)