2 module Vectorise.Utils.PRDict (
10 import Vectorise.Monad
11 import Vectorise.Builtins
12 import Vectorise.Utils.PADict
22 prDFunOfTyCon :: TyCon -> VM CoreExpr
25 . maybeCantVectoriseM "No PR dictionary for tycon" (ppr tycon)
30 prDictOfType :: Type -> VM CoreExpr
31 prDictOfType ty = prDictOfTyApp ty_fn ty_args
33 (ty_fn, ty_args) = splitAppTys ty
35 prDictOfTyApp :: Type -> [Type] -> VM CoreExpr
36 prDictOfTyApp ty_fn ty_args
37 | Just ty_fn' <- coreView ty_fn = prDictOfTyApp ty_fn' ty_args
38 prDictOfTyApp (TyConApp tc _) ty_args
40 dfun <- liftM Var $ maybeV (lookupTyConPR tc)
41 prDFunApply dfun ty_args
42 prDictOfTyApp _ _ = noV
44 prDFunApply :: CoreExpr -> [Type] -> VM CoreExpr
47 dicts <- mapM prDictOfType tys
48 return $ mkApps (mkTyApps dfun tys) dicts
50 wrapPR :: Type -> VM CoreExpr
53 Just pa_dict <- paDictOfType ty
54 pr_dfun <- prDFunOfTyCon =<< builtin wrapTyCon
55 return $ mkApps pr_dfun [Type ty, pa_dict]