Skip to content

Commit 3326818

Browse files
authored
Merge pull request #2 from seaburg/move-optimization
Reduce number of steps when moving items
2 parents 34eabfe + 76b4c1b commit 3326818

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

PHDiff/PHDiff/Sources/PHDiff.swift

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public struct PHDiff {
3434
deleteOffsets[j] = runningOffset
3535
if ref.symbol != nil {
3636
steps.append(.delete(value: context.fromArray[j], index: j))
37-
runningOffset += 1
37+
runningOffset -= 1
3838
}
3939
}
4040

@@ -49,9 +49,12 @@ public struct PHDiff {
4949
}
5050

5151
// Checks for the current offset, if matches means that this move is not needed
52-
let deleteOffset = deleteOffsets[j]
53-
if (j - deleteOffset + runningOffset) != i {
52+
let expectedOldIndex = j + runningOffset + deleteOffsets[j]
53+
if expectedOldIndex != i {
5454
steps.append(.move(value: context.toArray[i], fromIndex: j, toIndex: i))
55+
if expectedOldIndex > i {
56+
runningOffset += 1
57+
}
5558
}
5659
} else {
5760
steps.append(.insert(value: context.toArray[i], index: i))

PHDiff/PHDiffTests/PHDiffTests.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,19 @@ final class PHDiffTests: XCTestCase {
6565
newArray = ["b", "c", "c"]
6666
steps = PHDiff.sortedSteps(fromArray: oldArray, toArray: newArray)
6767
XCTAssertEqual(steps, [ DiffStep.delete(value: "a", index: 0), DiffStep.insert(value: "c", index: 2) ])
68+
69+
oldArray = ["a", "b", "c"]
70+
newArray = ["c", "a", "b"]
71+
steps = PHDiff.steps(fromArray: oldArray, toArray: newArray)
72+
XCTAssertEqual(steps, [ DiffStep.move(value: "c", fromIndex: 2, toIndex: 0)])
73+
74+
oldArray = ["a", "b", "c"]
75+
newArray = ["b", "c", "a"]
76+
steps = PHDiff.steps(fromArray: oldArray, toArray: newArray)
77+
XCTAssertEqual(steps, [
78+
DiffStep.move(value: "b", fromIndex: 1, toIndex: 0),
79+
DiffStep.move(value: "c", fromIndex: 2, toIndex: 1),
80+
])
6881
}
6982

7083
func testDiffUpdate() {

0 commit comments

Comments
 (0)