diff --git a/MVMCoreUI/Atomic/Protocols/ModelProtocols/MoleculeModelProtocol.swift b/MVMCoreUI/Atomic/Protocols/ModelProtocols/MoleculeModelProtocol.swift index 3dc09d7c..672105ef 100644 --- a/MVMCoreUI/Atomic/Protocols/ModelProtocols/MoleculeModelProtocol.swift +++ b/MVMCoreUI/Atomic/Protocols/ModelProtocols/MoleculeModelProtocol.swift @@ -19,7 +19,7 @@ public extension MoleculeModelProtocol { static var categoryCodingKey: String { "moleculeName" } - func isEqual(to model: ModelProtocol) -> Bool { + func isEqual(to model: ModelComparisonProtocol) -> Bool { guard let model = model as? Self else { return false } return moleculeName == model.moleculeName && backgroundColor == model.backgroundColor diff --git a/MVMCoreUI/Atomic/Protocols/ModelProtocols/ParentMoleculeModelProtocol.swift b/MVMCoreUI/Atomic/Protocols/ModelProtocols/ParentMoleculeModelProtocol.swift index 88b09b86..d0e1c13f 100644 --- a/MVMCoreUI/Atomic/Protocols/ModelProtocols/ParentMoleculeModelProtocol.swift +++ b/MVMCoreUI/Atomic/Protocols/ModelProtocols/ParentMoleculeModelProtocol.swift @@ -181,3 +181,13 @@ public extension ParentModelProtocol { return allDiffs } } + +public extension ModelComparisonProtocol where Self: MoleculeModelProtocol { + + func deepEquals(to model: ModelProtocol) -> Bool { + if let self = self as? ParentModelProtocol { + return self.deepEquals(to: model) + } + return isEqual(to: model) + } +} diff --git a/MVMCoreUI/Behaviors/ReplaceableMoleculeBehaviorModel.swift b/MVMCoreUI/Behaviors/ReplaceableMoleculeBehaviorModel.swift index 42f1aea5..c03594d4 100644 --- a/MVMCoreUI/Behaviors/ReplaceableMoleculeBehaviorModel.swift +++ b/MVMCoreUI/Behaviors/ReplaceableMoleculeBehaviorModel.swift @@ -70,7 +70,7 @@ public class ReplaceableMoleculeBehavior: PageMoleculeTransformationBehavior, Co // Top level check to return a new root molecule. if let updatedMolecule = moleculeModels.first(where: { rootMolecule.id == $0.id }) { - guard !updatedMolecule.isEqual(to: rootMolecule) else { + guard !updatedMolecule.deepEquals(to: rootMolecule) else { debugLog("top molecule \(updatedMolecule) is the same as \(rootMolecule). skipping...") return rootMolecule } @@ -86,7 +86,7 @@ public class ReplaceableMoleculeBehavior: PageMoleculeTransformationBehavior, Co moleculeModels.forEach { newMolecule in do { if let replacedMolecule = try parentMolecule.replaceChildMolecule(with: newMolecule) { - guard !replacedMolecule.isEqual(to: newMolecule) else { + guard !replacedMolecule.deepEquals(to: newMolecule) else { // Note: Slight risk here of replacing the something in the original tree and misreporting that is it not replaced based on equality. debugLog("deep molecule \(newMolecule) is the same as \(replacedMolecule). skipping...") return @@ -107,7 +107,7 @@ public class ReplaceableMoleculeBehavior: PageMoleculeTransformationBehavior, Co } let hasReplacement = !changeList.isEmpty changes.append(contentsOf: changeList) - debugLog("replacing \(hasReplacement ? updatedRootMolecules.count : 0) molecules") + debugLog("replacing \(hasReplacement ? updatedRootMolecules.count : 0) molecules for \(changes)") return hasReplacement ? updatedRootMolecules : nil }