module DDC.Core.Lite.Compounds
        ( tBoolU, tBool
        , tNatU,  tNat, dcNatU, xNatU
        , tIntU,  tInt
        , tWordU
        , tPair
        , tList)
where
import DDC.Core.Lite.Name
import DDC.Core.Compounds
import DDC.Core.Exp


-- Bools ----------------------------------------------------------------------
-- | Application of the Bool type constructor.
tBool  :: Region Name -> Type Name
tBool r1 
 = TApp (TCon tcBool) r1
 where  tcBool  = TyConBound (UPrim (NameDataTyCon DataTyConBool) kBool) kBool
        kBool   = kFun kRegion kData


-- | Unboxed `Bool#` type constructor.
tBoolU :: Type Name
tBoolU  = TCon (TyConBound (UPrim (NamePrimTyCon PrimTyConBool) kData) kData)


-- Nats -----------------------------------------------------------------------
-- | The Nat# type constructor.
tNatU ::  Type Name
tNatU   = TCon (TyConBound (UPrim (NamePrimTyCon PrimTyConNat) kData) kData)


-- | A Literal Nat# data constructor.
dcNatU :: Integer -> DaCon Name
dcNatU i = DaConPrim (NameLitNat i) tNatU


-- | A literal Nat#
xNatU  :: a -> Integer -> Exp a Name
xNatU a i = XCon a (dcNatU i)


-- | Application of the Nat type constructor.
tNat :: Region Name -> Type Name
tNat r1 
 = TApp (TCon tcNat) r1
 where  tcNat   = TyConBound (UPrim (NameDataTyCon DataTyConNat) kNat) kNat
        kNat    = kFun kRegion kData


-- Ints -----------------------------------------------------------------------
-- | Unboxed `Int#` type constructor.
tIntU ::  Type Name
tIntU   = TCon (TyConBound (UPrim (NamePrimTyCon PrimTyConInt) kData) kData)


-- | Application of the Int type constructor.
tInt :: Region Name -> Type Name
tInt r1 
 = TApp (TCon tcInt) r1
 where  tcInt   = TyConBound (UPrim (NameDataTyCon DataTyConInt) kInt) kInt
        kInt    = kFun kRegion kData


-- Words ----------------------------------------------------------------------
-- | Unboxed `WordN#` type constructor of the given width.
tWordU :: Int -> Type Name
tWordU bits 
 = TCon (TyConBound (UPrim (NamePrimTyCon (PrimTyConWord bits)) kData) kData)


-- Pairs ----------------------------------------------------------------------
-- | Application of the Pair type constructor.
tPair :: Region Name -> Type Name -> Type Name -> Type Name
tPair tR tA tB
 = tApps (TCon tcPair) [tR, tA, tB]
 where  tcPair  = TyConBound (UPrim (NameDataTyCon DataTyConPair) kPair) kPair
        kPair   = kFuns [kRegion, kData, kData] kData


-- Lists ----------------------------------------------------------------------
-- | Application of the List type constructor.
tList :: Region Name -> Type Name -> Type Name
tList tR tA
 = tApps (TCon tcList) [tR, tA]
 where  tcList  = TyConBound (UPrim (NameDataTyCon DataTyConList) kList) kList
        kList   = kRegion `kFun` kData `kFun` kData