+
+
+wantedAncestorEqualities :: Inst -> TcM [Inst]
+wantedAncestorEqualities dict
+ | isClassDict dict
+ = mapM mkWantedEqInst $ filter isEqPred $ bagToList $ wantedAncestorEqualities' (dictPred dict) emptyBag
+ | otherwise
+ = return []
+
+wantedAncestorEqualities' :: PredType -> Bag PredType -> Bag PredType
+wantedAncestorEqualities' pred bag
+ = ASSERT( isClassPred pred )
+ let (clas, tys) = getClassPredTys pred
+ (tyvars, sc_theta, _, _) = classBigSig clas
+ sc_theta' = substTheta (zipTopTvSubst tyvars tys) sc_theta
+ add_sc bag sc_pred
+ | elemBag sc_pred bag = bag
+ | not (isEqPred sc_pred)
+ && not (isClassPred sc_pred)
+ = bag
+ | isEqPred sc_pred = consBag sc_pred bag
+ | otherwise = let bag' = consBag sc_pred bag
+ in wantedAncestorEqualities' sc_pred bag'
+ in foldl add_sc bag sc_theta'
+