module VectType ( vectTyCon, vectType, vectTypeEnv,
- PAInstance, buildPADict,
- vectDataConWorkers )
+ PAInstance, buildPADict )
where
#include "HsVersions.h"
import Outputable
import Control.Monad ( liftM, liftM2, zipWithM, zipWithM_ )
-import Data.List ( inits, tails )
+import Data.List ( inits, tails, zipWith4 )
-- ----------------------------------------------------------------------------
-- Types
, painstArrTyCon :: TyCon
}
-vectTypeEnv :: TypeEnv -> VM (TypeEnv, [FamInst])
+vectTypeEnv :: TypeEnv -> VM (TypeEnv, [FamInst], [(Var, CoreExpr)])
vectTypeEnv env
= do
cs <- readGEnv $ mk_map . global_tycons
parr_tcs <- zipWithM buildPArrayTyCon orig_tcs vect_tcs
dfuns <- mapM mkPADFun vect_tcs
defTyConPAs (zip vect_tcs dfuns)
+ binds <- sequence (zipWith4 buildTyConBindings orig_tcs vect_tcs parr_tcs dfuns)
let all_new_tcs = new_tcs ++ parr_tcs
++ [ADataCon dc | tc <- all_new_tcs
, dc <- tyConDataCons tc])
- return (new_env, map mkLocalFamInst parr_tcs)
+ return (new_env, map mkLocalFamInst parr_tcs, concat binds)
where
tycons = typeEnvTyCons env
groups = tyConGroups tycons
e <- replicatePA len n
return [e]
}
-
-vectDataConWorkers :: PAInstance -> VM [(Var, CoreExpr)]
-vectDataConWorkers (PAInstance { painstOrigTyCon = orig_tc
- , painstVectTyCon = vect_tc
- , painstArrTyCon = arr_tc
- })
+
+buildTyConBindings :: TyCon -> TyCon -> TyCon -> Var -> VM [(Var, CoreExpr)]
+buildTyConBindings orig_tc vect_tc arr_tc dfun
= do
shape <- tyConShape vect_tc
sequence_ (zipWith3 (vectDataConWorker shape vect_tc arr_tc arr_dc)