ddc-core-flow-0.3.2.1: DDC/Core/Flow/Prim/DaConPrim.hs
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
-- | A literal @Bool#@
xBool :: Bool -> Exp a Name
xBool b = XCon (mkDaConAlg (NameLitBool b) tBool)
-- | A literal @Bool#@ data constructor.
dcBool :: Bool -> DaCon Name
dcBool b = mkDaConAlg (NameLitBool b) tBool
-- | A literal @Nat#@
xNat :: Integer -> Exp a Name
xNat i = XCon (dcNat i)
-- | A Literal @Nat#@ data constructor.
dcNat :: Integer -> DaCon Name
dcNat i = mkDaConAlg (NameLitInt i) tNat
-- | Data constructor for @Tuple1#@
dcTuple1 :: DaCon Name
dcTuple1 = mkDaConAlg (NameDaConFlow (DaConFlowTuple 1))
$ typeDaConFlow (DaConFlowTuple 1)
-- | Construct a @Tuple2#@
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]
-- | Data constructor for @Tuple2#@
dcTuple2 :: DaCon Name
dcTuple2 = mkDaConAlg (NameDaConFlow (DaConFlowTuple 2))
$ typeDaConFlow (DaConFlowTuple 2)
-- | Data constructor for n-tuples
dcTupleN :: Int -> DaCon Name
dcTupleN n
= mkDaConAlg (NameDaConFlow (DaConFlowTuple n))
$ typeDaConFlow (DaConFlowTuple n)