-- | Construct applications of primitive control operators. module DDC.Core.Salt.Compounds.PrimControl ( xFail , xReturn , typeOfPrimControl) where import DDC.Core.Salt.Name import DDC.Core.Exp.Annot -- | All the Prim Control vars have this form. xPrimControl a p = XVar a (UPrim (NamePrimOp $ PrimControl p) (typeOfPrimControl p)) -- | Fail with an internal error. xFail :: a -> Type Name -> Exp a Name xFail a t = xApps a (xPrimControl a PrimControlFail) [XType a t] -- | Return a value. xReturn :: a -> Type Name -> Exp a Name -> Exp a Name xReturn a t x = xApps a (xPrimControl a PrimControlReturn) [XType a t, x] typeOfPrimControl :: PrimControl -> Type Name typeOfPrimControl pc = case pc of PrimControlFail -> tForall kData $ \t -> t PrimControlReturn -> tForall kData $ \t -> t `tFun` t