2 module Vectorise.Utils.Poly (
10 import Vectorise.Monad
11 import Vectorise.Utils.PADict
18 -- Poly Functions -------------------------------------------------------------
19 polyAbstract :: [TyVar] -> ([Var] -> VM a) -> VM a
23 mdicts <- mapM mk_dict_var tvs
24 zipWithM_ (\tv -> maybe (defLocalTyVar tv)
25 (defLocalTyVarWithPA tv . Var)) tvs mdicts
31 Just ty -> liftM Just (newLocalVar (fsLit "dPA") ty)
32 Nothing -> return Nothing
34 mk_args mdicts = [dict | Just dict <- mdicts]
37 polyArity :: [TyVar] -> VM Int
39 tys <- mapM paDictArgType tvs
40 return $ length [() | Just _ <- tys]
43 polyApply :: CoreExpr -> [Type] -> VM CoreExpr
45 = do dicts <- mapM paDictOfType tys
46 return $ expr `mkTyApps` tys `mkApps` dicts
49 polyVApply :: VExpr -> [Type] -> VM VExpr
51 = do dicts <- mapM paDictOfType tys
52 return $ mapVect (\e -> e `mkTyApps` tys `mkApps` dicts) expr