- is_product | [_] <- data_cons = True
- | otherwise = False
-
- mk_shape uarr = intPrimTy : mk_sel uarr
-
- mk_sel uarr | is_product = []
- | otherwise = [uarr_int, uarr_int]
- where
- uarr_int = mkTyConApp uarr [intTy]
-
- mk_tycon get_tc tys
- | n > 1 = builtin (Just . get_tc n)
- | otherwise = return Nothing
- where n = length tys
-
- mk_single_datacon tc | [dc] <- tyConDataCons tc = dc
-
- mk_tc_app_maybe Nothing [] = unitTy
- mk_tc_app_maybe Nothing [ty] = ty
- mk_tc_app_maybe (Just tc) tys = mkTyConApp tc tys
-
- arr_repr_elem_tys [] = [unitTy]
- arr_repr_elem_tys tys = tys
-
-mkToArrPRepr :: CoreExpr -> CoreExpr -> [[CoreExpr]] -> VM CoreExpr
-mkToArrPRepr len sel ess
- = do
- let mk_sum [(expr, ty)] = return (expr, ty)
- mk_sum es
- = do
- sum_tc <- builtin . sumTyCon $ length es
- (sum_rtc, _) <- parrayReprTyCon (mkTyConApp sum_tc tys)
- let [sum_rdc] = tyConDataCons sum_rtc
-
- return (mkConApp sum_rdc (map Type tys ++ (len : sel : exprs)),
- mkTyConApp sum_tc tys)
- where
- (exprs, tys) = unzip es
-
- mk_prod [expr] = return (expr, splitPArrayTy (exprType expr))
- mk_prod exprs
- = do
- prod_tc <- builtin . prodTyCon $ length exprs
- (prod_rtc, _) <- parrayReprTyCon (mkTyConApp prod_tc tys)
- let [prod_rdc] = tyConDataCons prod_rtc
-
- return (mkConApp prod_rdc (map Type tys ++ (len : exprs)),
- mkTyConApp prod_tc tys)
- where
- tys = map (splitPArrayTy . exprType) exprs
-
- liftM fst (mk_sum =<< mapM mk_prod ess)
-
-mkFromArrPRepr :: CoreExpr -> Type -> Var -> Var -> [[Var]] -> CoreExpr
- -> VM CoreExpr
-mkFromArrPRepr scrut res_ty len sel vars res
- = return (Var unitDataConId)
-
-mkClosureType :: Type -> Type -> VM Type
-mkClosureType arg_ty res_ty = mkBuiltinTyConApp closureTyCon [arg_ty, res_ty]