Diff
June 3, 2020 ยท View on GitHub
Simple diffing library in pure Swift.
Installing
You can use Carthage or Swift Package Manager to install Diff.
Usage
Start by importing the package:
import Diff
Same
If there is no difference, the diff will be nil.
diff("Hello", "Hello") // nil
For the sake of brevity, we'll ! the rest of the examples since we know they're different.
Insert
let (range, string) = diff("Hello world", "Hello there world")!
// range: 6..<6
// string: "there "
Remove
let (range, string) = diff("Hello there world", "Hello world")!
// range: 6..<12
// string: ""
Other Types
Diff can diff any array. Here's an array of things that conform to Equatable:
let (range, replacement) = diff([1, 2, 3], [1, 2, 3, 4])!
// range: 3..<3
// replacement: [4]
You can even use arrays of anything as long as you can compare them:
let before: [Foo] = [a, b]
let after: [Foo] = [b]
let (range, replacement) = diff(before, after, compare: Foo.compare)!
// range: 0..<1
// replacement: []
Development
If you want to contribute to Diff, please write a test.
Building and running the tests locally with SPM is easy:
$ git clone https://github.com/soffes/Diff
$ cd Diff
$ swift build
$ swift test
Thanks
Thanks to Jonathan Clem for the original algorithm and Caleb Davenport for inspiration for the generics implementation and help debugging a few edge cases!