module DDC.Core.Tetra.Compounds
( module DDC.Core.Exp.Annot.Compounds
, tBool, tNat, tInt, tSize, tWord, tFloat
, tPtr
, tTupleN
, tUnboxed
, tFunValue, tCloValue
, tTextLit
, xFunCReify, xFunCCurry, xFunApply, xFunCurry
, xCastConvert)
where
import DDC.Core.Tetra.Prim.TyConTetra
import DDC.Core.Tetra.Prim.TyConPrim
import DDC.Core.Tetra.Prim.OpCast
import DDC.Core.Tetra.Prim.OpFun
import DDC.Core.Tetra.Prim.Base
import DDC.Core.Exp.Annot.Compounds
import DDC.Core.Exp.Annot.Exp
xFunCReify
:: a
-> Type Name
-> Type Name
-> Exp a Name
-> Exp a Name
xFunCReify a tParam tResult xF
= xApps a
(XVar a (UPrim (NameOpFun OpFunCReify)
(typeOpFun OpFunCReify)))
[XType a tParam, XType a tResult, xF]
xFunCCurry
:: a
-> [Type Name]
-> Type Name
-> Exp a Name
-> Exp a Name
xFunCCurry a tsParam tResult xF
= xApps a
(XVar a (UPrim (NameOpFun (OpFunCCurry (length tsParam)))
(typeOpFun (OpFunCCurry (length tsParam)))))
((map (XType a) tsParam) ++ [XType a tResult] ++ [xF])
xFunCurry
:: a
-> [Type Name]
-> Type Name
-> Exp a Name
-> Exp a Name
xFunCurry a tsParam tResult xF
= xApps a
(XVar a (UPrim (NameOpFun (OpFunCurry (length tsParam)))
(typeOpFun (OpFunCurry (length tsParam)))))
((map (XType a) tsParam) ++ [XType a tResult] ++ [xF])
xFunApply
:: a
-> [Type Name]
-> Type Name
-> Exp a Name
-> [Exp a Name]
-> Exp a Name
xFunApply a tsArg tResult xF xsArg
= xApps a
(XVar a (UPrim (NameOpFun (OpFunApply (length xsArg)))
(typeOpFun (OpFunApply (length xsArg)))))
((map (XType a) tsArg) ++ [XType a tResult] ++ [xF] ++ xsArg)
xCastConvert :: a -> Type Name -> Type Name -> Exp a Name -> Exp a Name
xCastConvert a tTo tFrom x
= xApps a
(XVar a (UPrim (NamePrimCast PrimCastConvert)
(typePrimCast PrimCastConvert)))
[ XType a tTo
, XType a tFrom
, x ]