+buildFromArrPRepr repr@(ProdRepr {
+ repr_prod_arg_tys = prod_arg_tys
+ , repr_prod_arr_tycon = prod_arr_tycon
+ , repr_prod_arr_data_con = prod_arr_data_con
+ , repr_type = repr_type
+ })
+ vect_tc prepr_tc arr_tc
+ = do
+ rep_el_ty <- mkPReprType el_ty
+ arg_ty <- mkPArrayType rep_el_ty
+ shape_tys <- arrShapeTys repr
+ arr_tys <- arrReprTys repr
+ res_ty <- mkPArrayType el_ty
+
+ arg <- newLocalVar FSLIT("xs") arg_ty
+ shape_vars <- mapM (newLocalVar FSLIT("sh")) shape_tys
+ rep_vars <- mapM (newLocalVar FSLIT("ys")) arr_tys
+
+ let vars = shape_vars ++ rep_vars
+
+ parray_co <- mkBuiltinCo parrayTyCon
+
+ let res = wrapFamInstBody arr_tc var_tys
+ . mkConApp arr_dc
+ $ map Type var_tys ++ map Var vars
+
+ Just repr_co = tyConFamilyCoercion_maybe prepr_tc
+ co = mkAppCoercion parray_co
+ $ mkTyConApp repr_co var_tys
+
+ scrut = unwrapFamInstScrut prod_arr_tycon prod_arg_tys
+ $ mkCoerce co (Var arg)
+
+ return . Lam arg
+ $ Case (scrut)
+ (mkWildId (mkTyConApp prod_arr_tycon prod_arg_tys))
+ res_ty
+ [(DataAlt prod_arr_data_con, vars, res)]
+ where
+ var_tys = mkTyVarTys $ tyConTyVars vect_tc
+ el_ty = mkTyConApp vect_tc var_tys
+
+ [arr_dc] = tyConDataCons arr_tc