2 module Vectorise.Utils.Poly (
10 import Vectorise.Monad
11 import Vectorise.Utils.PADict
19 -- Poly Functions -------------------------------------------------------------
20 polyAbstract :: [TyVar] -> ([Var] -> VM a) -> VM a
24 mdicts <- mapM mk_dict_var tvs
25 zipWithM_ (\tv -> maybe (defLocalTyVar tv)
26 (defLocalTyVarWithPA tv . Var)) tvs mdicts
32 Just ty -> liftM Just (newLocalVar (fsLit "dPA") ty)
33 Nothing -> return Nothing
35 mk_args mdicts = [dict | Just dict <- mdicts]
38 polyArity :: [TyVar] -> VM Int
40 tys <- mapM paDictArgType tvs
41 return $ length [() | Just _ <- tys]
44 polyApply :: CoreExpr -> [Type] -> VM CoreExpr
46 = do dicts <- mapM paDictOfType tys
47 return $ expr `mkTyApps` tys `mkApps` dicts
50 polyVApply :: VExpr -> [Type] -> VM VExpr
52 = do dicts <- mapM paDictOfType tys
53 return $ mapVect (\e -> e `mkTyApps` tys `mkApps` dicts) expr