+ -- Example
+ -- data instance T (b,c) where
+ -- TI :: forall e. e -> T (e,e)
+ --
+ -- The representation tycon looks like this:
+ -- data :R7T b c where
+ -- TI :: forall b1 c1. (b1 ~ c1) => b1 -> :R7T b1 c1
+
+ orig_res_ty
+ | Just (fam_tc, fam_tys) <- tyConFamInst_maybe tycon
+ , let fam_subst = zipTopTvSubst (tyConTyVars tycon) res_tys
+ = mkTyConApp fam_tc (substTys fam_subst fam_tys)
+ | otherwise
+ = mkTyConApp tycon res_tys
+ where
+ res_tys = substTyVars (mkTopTvSubst eq_spec) univ_tvs
+ -- In the example above,
+ -- univ_tvs = [ b1, c1 ]
+ -- res_tys = [ b1, b1 ]
+