collectAnnTypeBinders, collectAnnTypeArgs, isAnnTypeArg,
splitClosureTy,
mkPADictType, mkPArrayType,
- paDictArgType, paDictOfType,
+ paDictArgType, paDictOfType, paMethod,
lookupPArrayFamInst,
hoistExpr, takeHoisted
) where
dicts <- mapM paDictOfType tys
return $ mkApps (mkTyApps dfun tys) dicts
+paMethod :: (Builtins -> Var) -> Type -> VM CoreExpr
+paMethod method ty
+ = do
+ fn <- builtin method
+ dict <- paDictOfType ty
+ return $ mkApps (Var fn) [Type ty, dict]
+
lookupPArrayFamInst :: Type -> VM (TyCon, [Type])
lookupPArrayFamInst ty = builtin parrayTyCon >>= (`lookupFamInst` [ty])
-- Expressions
replicateP :: CoreExpr -> CoreExpr -> VM CoreExpr
-replicateP expr len
- = do
- dict <- paDictOfType ty
- rep <- builtin replicatePAVar
- return $ mkApps (Var rep) [Type ty, dict, expr, len]
- where
- ty = exprType expr
+replicateP expr len = liftM (`mkApps` [expr, len])
+ (paMethod replicatePAVar (exprType expr))
capply :: (CoreExpr, CoreExpr) -> (CoreExpr, CoreExpr) -> VM (CoreExpr, CoreExpr)
capply (vfn, lfn) (varg, larg)
bind_lenv lenv lbody lc_bndr [lbndr]
= do
- lengthPA <- builtin lengthPAVar
- pa_dict <- paDictOfType vty
+ lengthPA <- paMethod lengthPAVar vty
return . Let (NonRec lbndr lenv)
- $ Case (mkApps (Var lengthPA) [Type vty, pa_dict, (Var lbndr)])
+ $ Case (App lengthPA (Var lbndr))
lc_bndr
(exprType lbody)
[(DEFAULT, [], lbody)]