+ (umods, ufs, vmods, vfs) = unzip4 preludeVars
+
+defaultDataConWorkers :: [DataCon]
+defaultDataConWorkers = [trueDataCon, falseDataCon, unitDataCon]
+
+preludeVars :: [(Module, FastString, Module, FastString)]
+preludeVars
+ = [
+ mk gHC_PARR FSLIT("mapP") nDP_COMBINATORS FSLIT("mapPA")
+ , mk gHC_PARR FSLIT("zipWithP") nDP_COMBINATORS FSLIT("zipWithPA")
+ , mk gHC_PARR FSLIT("zipP") nDP_COMBINATORS FSLIT("zipPA")
+ , mk gHC_PARR FSLIT("filterP") nDP_COMBINATORS FSLIT("filterPA")
+ , mk gHC_PARR FSLIT("lengthP") nDP_COMBINATORS FSLIT("lengthPA")
+ , mk gHC_PARR FSLIT("replicateP") nDP_COMBINATORS FSLIT("replicatePA")
+ , mk gHC_PARR FSLIT("!:") nDP_COMBINATORS FSLIT("indexPA")
+ , mk gHC_PARR FSLIT("crossMapP") nDP_COMBINATORS FSLIT("crossMapPA")
+ , mk gHC_PARR FSLIT("singletonP") nDP_COMBINATORS FSLIT("singletonPA")
+ , mk gHC_PARR FSLIT("concatP") nDP_COMBINATORS FSLIT("concatPA")
+ , mk gHC_PARR FSLIT("+:+") nDP_COMBINATORS FSLIT("appPA")
+
+ , mk nDP_PRELUDE_INT FSLIT("plus") nDP_PRELUDE_INT FSLIT("plusV")
+ , mk nDP_PRELUDE_INT FSLIT("minus") nDP_PRELUDE_INT FSLIT("minusV")
+ , mk nDP_PRELUDE_INT FSLIT("mult") nDP_PRELUDE_INT FSLIT("multV")
+ , mk nDP_PRELUDE_INT FSLIT("sumP") nDP_PRELUDE_INT FSLIT("sumPA")
+ , mk nDP_PRELUDE_INT FSLIT("upToP") nDP_PRELUDE_INT FSLIT("upToPA")
+
+ , mk nDP_PRELUDE_INT FSLIT("eq") nDP_PRELUDE_INT FSLIT("eqV")
+ , mk nDP_PRELUDE_INT FSLIT("neq") nDP_PRELUDE_INT FSLIT("neqV")
+ , mk nDP_PRELUDE_INT FSLIT("le") nDP_PRELUDE_INT FSLIT("leV")
+ , mk nDP_PRELUDE_INT FSLIT("lt") nDP_PRELUDE_INT FSLIT("ltV")
+ , mk nDP_PRELUDE_INT FSLIT("ge") nDP_PRELUDE_INT FSLIT("geV")
+ , mk nDP_PRELUDE_INT FSLIT("gt") nDP_PRELUDE_INT FSLIT("gtV")
+
+ , mk nDP_PRELUDE_DOUBLE FSLIT("plus") nDP_PRELUDE_DOUBLE FSLIT("plusV")
+ , mk nDP_PRELUDE_DOUBLE FSLIT("minus") nDP_PRELUDE_DOUBLE FSLIT("minusV")
+ , mk nDP_PRELUDE_DOUBLE FSLIT("mult") nDP_PRELUDE_DOUBLE FSLIT("multV")
+ , mk nDP_PRELUDE_DOUBLE FSLIT("sumP") nDP_PRELUDE_DOUBLE FSLIT("sumPA")
+ , mk nDP_PRELUDE_DOUBLE FSLIT("minIndexP")
+ nDP_PRELUDE_DOUBLE FSLIT("minIndexPA")
+ , mk nDP_PRELUDE_DOUBLE FSLIT("maxIndexP")
+ nDP_PRELUDE_DOUBLE FSLIT("maxIndexPA")
+
+ , mk nDP_PRELUDE_DOUBLE FSLIT("eq") nDP_PRELUDE_DOUBLE FSLIT("eqV")
+ , mk nDP_PRELUDE_DOUBLE FSLIT("neq") nDP_PRELUDE_DOUBLE FSLIT("neqV")
+ , mk nDP_PRELUDE_DOUBLE FSLIT("le") nDP_PRELUDE_DOUBLE FSLIT("leV")
+ , mk nDP_PRELUDE_DOUBLE FSLIT("lt") nDP_PRELUDE_DOUBLE FSLIT("ltV")
+ , mk nDP_PRELUDE_DOUBLE FSLIT("ge") nDP_PRELUDE_DOUBLE FSLIT("geV")
+ , mk nDP_PRELUDE_DOUBLE FSLIT("gt") nDP_PRELUDE_DOUBLE FSLIT("gtV")
+
+ -- FIXME: temporary
+ , mk nDP_PRELUDE_PARR FSLIT("fromPArrayP") nDP_PRELUDE_PARR FSLIT("fromPArrayPA")
+ , mk nDP_PRELUDE_PARR FSLIT("toPArrayP") nDP_PRELUDE_PARR FSLIT("toPArrayPA")
+ , mk nDP_PRELUDE_PARR FSLIT("fromNestedPArrayP") nDP_PRELUDE_PARR FSLIT("fromNestedPArrayPA")
+ ]
+ where
+ mk = (,,,)
+
+initBuiltinTyCons :: Builtins -> DsM [(Name, TyCon)]
+initBuiltinTyCons bi
+ = do
+ -- parr <- externalTyCon nDP_PRELUDE_PARR FSLIT("PArr")
+ return $ (tyConName funTyCon, closureTyCon bi)
+ : (parrTyConName, parrayTyCon bi)
+
+ -- FIXME: temporary
+ : (tyConName $ parrayTyCon bi, parrayTyCon bi)
+
+ : [(tyConName tc, tc) | tc <- defaultTyCons]
+
+defaultTyCons :: [TyCon]
+defaultTyCons = [intTyCon, boolTyCon, doubleTyCon]
+
+initBuiltinDataCons :: Builtins -> [(Name, DataCon)]
+initBuiltinDataCons bi = [(dataConName dc, dc)| dc <- defaultDataCons]