module DDC.Core.Flow.Prim.DaConPrim
( xBool, dcBool
, xNat, dcNat
, dcTuple1
, xTuple2, dcTuple2
, dcTupleN)
where
import DDC.Core.Flow.Prim.TyConPrim
import DDC.Core.Flow.Prim.DaConFlow
import DDC.Core.Flow.Prim.Base
import DDC.Core.Compounds.Simple
import DDC.Core.Exp.Simple
xBool :: Bool -> Exp a Name
xBool b = XCon (mkDaConAlg (NameLitBool b) tBool)
dcBool :: Bool -> DaCon Name
dcBool b = mkDaConAlg (NameLitBool b) tBool
xNat :: Integer -> Exp a Name
xNat i = XCon (dcNat i)
dcNat :: Integer -> DaCon Name
dcNat i = mkDaConAlg (NameLitInt i) tNat
dcTuple1 :: DaCon Name
dcTuple1 = mkDaConAlg (NameDaConFlow (DaConFlowTuple 1))
$ typeDaConFlow (DaConFlowTuple 1)
xTuple2 :: Type Name -> Type Name
-> Exp a Name -> Exp a Name
-> Exp a Name
xTuple2 t1 t2 x1 x2
= xApps (XCon dcTuple2)
[XType t1, XType t2, x1, x2]
dcTuple2 :: DaCon Name
dcTuple2 = mkDaConAlg (NameDaConFlow (DaConFlowTuple 2))
$ typeDaConFlow (DaConFlowTuple 2)
dcTupleN :: Int -> DaCon Name
dcTupleN n
= mkDaConAlg (NameDaConFlow (DaConFlowTuple n))
$ typeDaConFlow (DaConFlowTuple n)