Awesome
ListDiff
ListDiff is a Swift port of IGListKit's IGListDiff. It is an implementation of an algorithm by Paul Heckel that calculates the diff between 2 arrays.
Motivation
The motivation for this project came from the following challenge which I learnt about it from Ryan Nystrom's talk at iOSConf.SG.
Getting Started
swift package generate-xcodeproj
Installation
CocoaPods
pod 'ListDiff'
Carthage
github "lxcid/ListDiff" "master"
Usage
import ListDiff
extension Int : Diffable {
public var diffIdentifier: AnyHashable {
return self
}
}
let o = [0, 1, 2]
let n = [2, 1, 3]
let result = List.diffing(oldArray: o, newArray: n)
// result.hasChanges == true
// result.deletes == IndexSet(integer: 0)
// result.inserts == IndexSet(integer: 2)
// result.moves == [List.MoveIndex(from: 2, to: 0), List.MoveIndex(from: 1, to: 1)]
// result.changeCount == 4
Rationale
During the port, I made several decisions which I would like to rationalize here.
- Using caseless enum as namespace. See Erica Sadun's post here.
- No support for index paths. Decided that this is out of the scope.
- Stack vs Heap. AFAIK, Swift does not advocates thinking about stack vs heap allocation model, leaving the optimization decisions to compiler instead. Nevertheless, some of the guideline do favour
struct
more, so onlyList.Entry
is a (final) class as we need reference to its instances.