Digital PCT265 story PCT-135: Deep equals check for replacement changes.

This commit is contained in:
Hedden, Kyle Matthew 2024-05-21 13:56:02 -04:00
parent 75104dbe4d
commit 3ed40e52be
3 changed files with 14 additions and 4 deletions

View File

@ -19,7 +19,7 @@ public extension MoleculeModelProtocol {
static var categoryCodingKey: String { "moleculeName" } 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 } guard let model = model as? Self else { return false }
return moleculeName == model.moleculeName return moleculeName == model.moleculeName
&& backgroundColor == model.backgroundColor && backgroundColor == model.backgroundColor

View File

@ -181,3 +181,13 @@ public extension ParentModelProtocol {
return allDiffs 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)
}
}

View File

@ -70,7 +70,7 @@ public class ReplaceableMoleculeBehavior: PageMoleculeTransformationBehavior, Co
// Top level check to return a new root molecule. // Top level check to return a new root molecule.
if let updatedMolecule = moleculeModels.first(where: { rootMolecule.id == $0.id }) { 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...") debugLog("top molecule \(updatedMolecule) is the same as \(rootMolecule). skipping...")
return rootMolecule return rootMolecule
} }
@ -86,7 +86,7 @@ public class ReplaceableMoleculeBehavior: PageMoleculeTransformationBehavior, Co
moleculeModels.forEach { newMolecule in moleculeModels.forEach { newMolecule in
do { do {
if let replacedMolecule = try parentMolecule.replaceChildMolecule(with: newMolecule) { 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. // 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...") debugLog("deep molecule \(newMolecule) is the same as \(replacedMolecule). skipping...")
return return
@ -107,7 +107,7 @@ public class ReplaceableMoleculeBehavior: PageMoleculeTransformationBehavior, Co
} }
let hasReplacement = !changeList.isEmpty let hasReplacement = !changeList.isEmpty
changes.append(contentsOf: changeList) changes.append(contentsOf: changeList)
debugLog("replacing \(hasReplacement ? updatedRootMolecules.count : 0) molecules") debugLog("replacing \(hasReplacement ? updatedRootMolecules.count : 0) molecules for \(changes)")
return hasReplacement ? updatedRootMolecules : nil return hasReplacement ? updatedRootMolecules : nil
} }