+ con_repr con = liftM (ConRepr con) (prod_repr (dataConRepArgTys con))
+
+ prod_repr [] = return EmptyProd
+ prod_repr [ty] = liftM UnaryProd (comp_repr ty)
+ prod_repr tys = do
+ rs <- mapM comp_repr tys
+ tup_tc <- builtin (prodTyCon arity)
+ tys' <- mapM compReprType rs
+ (ptup_tc, _) <- pdataReprTyCon (mkTyConApp tup_tc tys')
+ return $ Prod { repr_tup_tc = tup_tc
+ , repr_ptup_tc = ptup_tc
+ , repr_comp_tys = tys'
+ , repr_comps = rs
+ }
+ where
+ arity = length tys
+
+ comp_repr ty = liftM (Keep ty) (prDictOfType ty)
+ `orElseV` return (Wrap ty)
+
+sumReprType :: SumRepr -> VM Type
+sumReprType EmptySum = voidType
+sumReprType (UnarySum r) = conReprType r
+sumReprType (Sum { repr_sum_tc = sum_tc, repr_con_tys = tys })
+ = return $ mkTyConApp sum_tc tys
+
+conReprType :: ConRepr -> VM Type
+conReprType (ConRepr _ r) = prodReprType r
+
+prodReprType :: ProdRepr -> VM Type
+prodReprType EmptyProd = voidType
+prodReprType (UnaryProd r) = compReprType r
+prodReprType (Prod { repr_tup_tc = tup_tc, repr_comp_tys = tys })
+ = return $ mkTyConApp tup_tc tys
+
+compReprType :: CompRepr -> VM Type
+compReprType (Keep ty _) = return ty
+compReprType (Wrap ty) = do
+ wrap_tc <- builtin wrapTyCon
+ return $ mkTyConApp wrap_tc [ty]
+
+compOrigType :: CompRepr -> Type
+compOrigType (Keep ty _) = ty
+compOrigType (Wrap ty) = ty
+
+buildToPRepr :: TyCon -> TyCon -> TyCon -> SumRepr -> VM CoreExpr
+buildToPRepr vect_tc repr_tc _ repr