2 collectAnnTypeBinders, collectAnnTypeArgs, isAnnTypeArg,
4 mkPADictType, mkPArrayType,
5 paDictArgType, paDictOfType,
9 #include "HsVersions.h"
22 import Control.Monad ( liftM )
24 collectAnnTypeArgs :: AnnExpr b ann -> (AnnExpr b ann, [Type])
25 collectAnnTypeArgs expr = go expr []
27 go (_, AnnApp f (_, AnnType ty)) tys = go f (ty : tys)
30 collectAnnTypeBinders :: AnnExpr Var ann -> ([Var], AnnExpr Var ann)
31 collectAnnTypeBinders expr = go [] expr
33 go bs (_, AnnLam b e) | isTyVar b = go (b:bs) e
34 go bs e = (reverse bs, e)
36 isAnnTypeArg :: AnnExpr b ann -> Bool
37 isAnnTypeArg (_, AnnType t) = True
38 isAnnTypeArg _ = False
40 isClosureTyCon :: TyCon -> Bool
41 isClosureTyCon tc = tyConUnique tc == closureTyConKey
43 splitClosureTy :: Type -> (Type, Type)
45 | Just (tc, [arg_ty, res_ty]) <- splitTyConApp_maybe ty
49 | otherwise = pprPanic "splitClosureTy" (ppr ty)
51 mkPADictType :: Type -> VM Type
54 tc <- builtin paDictTyCon
55 return $ TyConApp tc [ty]
57 mkPArrayType :: Type -> VM Type
60 tc <- builtin parrayTyCon
61 return $ TyConApp tc [ty]
63 paDictArgType :: TyVar -> VM (Maybe Type)
64 paDictArgType tv = go (TyVarTy tv) (tyVarKind tv)
66 go ty k | Just k' <- kindView k = go ty k'
69 tv <- newTyVar FSLIT("a") k1
70 mty1 <- go (TyVarTy tv) k1
73 mty2 <- go (AppTy ty (TyVarTy tv)) k2
74 return $ fmap (ForAllTy tv . FunTy ty1) mty2
79 = liftM Just (mkPADictType ty)
81 go ty k = return Nothing
83 paDictOfType :: Type -> VM CoreExpr
84 paDictOfType ty = paDictOfTyApp ty_fn ty_args
86 (ty_fn, ty_args) = splitAppTys ty
88 paDictOfTyApp :: Type -> [Type] -> VM CoreExpr
89 paDictOfTyApp ty_fn ty_args
90 | Just ty_fn' <- coreView ty_fn = paDictOfTyApp ty_fn' ty_args
91 paDictOfTyApp (TyVarTy tv) ty_args
93 dfun <- maybeV (lookupTyVarPA tv)
94 paDFunApply dfun ty_args
95 paDictOfTyApp (TyConApp tc _) ty_args
97 pa_class <- builtin paClass
98 (dfun, ty_args') <- lookupInst pa_class [TyConApp tc ty_args]
99 paDFunApply (Var dfun) ty_args'
100 paDictOfTyApp ty ty_args = pprPanic "paDictOfTyApp" (ppr ty)
102 paDFunApply :: CoreExpr -> [Type] -> VM CoreExpr
105 dicts <- mapM paDictOfType tys
106 return $ mkApps (mkTyApps dfun tys) dicts
108 lookupPArrayFamInst :: Type -> VM (TyCon, [Type])
109 lookupPArrayFamInst ty = builtin parrayTyCon >>= (`lookupFamInst` [ty])