ddc-core-flow-0.4.2.1: DDC/Core/Flow/Prim/TyConPrim.hs
module DDC.Core.Flow.Prim.TyConPrim
( kindPrimTyCon
, tVoid
, tBool
, tNat
, tInt
, tFloat
, tWord
, tVec)
where
import DDC.Core.Flow.Prim.Base
import DDC.Core.Exp.Simple.Compounds
import DDC.Core.Exp.Simple.Exp
-- | Yield the kind of a type constructor.
kindPrimTyCon :: PrimTyCon -> Kind Name
kindPrimTyCon tc
= case tc of
PrimTyConVoid -> kData
PrimTyConPtr -> kRegion `kFun` kData `kFun` kData
PrimTyConAddr -> kData
PrimTyConBool -> kData
PrimTyConNat -> kData
PrimTyConInt -> kData
PrimTyConSize -> kData
PrimTyConWord _ -> kData
PrimTyConFloat _ -> kData
PrimTyConTag -> kData
PrimTyConTextLit -> kData
PrimTyConVec _ -> kData `kFun` kData
-- Compounds ------------------------------------------------------------------
-- | Primitive `Void#` type.
tVoid = TCon (TyConBound (UPrim (NamePrimTyCon PrimTyConVoid) kData) kData)
-- | Primitive `Bool#` type.
tBool :: Type Name
tBool = TCon (TyConBound (UPrim (NamePrimTyCon PrimTyConBool) kData) kData)
-- | Primitive Nat# type.
tNat :: Type Name
tNat = TCon (TyConBound (UPrim (NamePrimTyCon PrimTyConNat) kData) kData)
-- | Primitive `Int#` type.
tInt :: Type Name
tInt = TCon (TyConBound (UPrim (NamePrimTyCon PrimTyConInt) kData) kData)
-- | Primitive `FloatN#` type of the given width.
tFloat :: Int -> Type Name
tFloat bits
= TCon (TyConBound (UPrim (NamePrimTyCon (PrimTyConFloat bits)) kData) kData)
-- | Primitive `WordN#` type of the given width.
tWord :: Int -> Type Name
tWord bits
= TCon (TyConBound (UPrim (NamePrimTyCon (PrimTyConWord bits)) kData) kData)
-- | Primitive @VecN# a@.
tVec :: Int -> Type Name -> Type Name
tVec n tA = TApp (tConPrimTyCon (PrimTyConVec n)) tA
-- Utils ----------------------------------------------------------------------
tConPrimTyCon :: PrimTyCon -> Type Name
tConPrimTyCon tcp
= let k = kindPrimTyCon tcp
u = UPrim (NamePrimTyCon tcp) k
tc = TyConBound u k
in TCon tc