Skip to content

Instantly share code, notes, and snippets.

@fernandomatal
Created May 21, 2019 09:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fernandomatal/1640b58f6a1b5460eb391990921c46c0 to your computer and use it in GitHub Desktop.
Save fernandomatal/1640b58f6a1b5460eb391990921c46c0 to your computer and use it in GitHub Desktop.
Updates between one and other array
import Foundation
typealias ArrayOrderedUpdates<T: Equatable> = (added: [T], removed: [T])
typealias ArrayNonOrderedUpdates<T: Hashable> = (added: [T], removed: [T])
extension Array where Element: Hashable {
/// Returns values added and removed from arrays. Faster solution that returns a non-ordered array
static func diffArrays(lhs: [Element], rhs: [Element]) -> ArrayNonOrderedUpdates<Element> {
let leftSet = Set(lhs)
let rightSet = Set(rhs)
let differences = leftSet.symmetricDifference(rightSet)
let added = rightSet.intersection(differences)
let removed = leftSet.intersection(differences)
return ArrayNonOrderedUpdates(Array<Element>(added), Array<Element>(removed))
}
}
extension Array where Element: Equatable {
/// Returns values added and removed from arrays with the original order.
static func diffArraysOrdered(lhs: [Element], rhs: [Element]) -> ArrayOrderedUpdates<Element> {
let leftMutable = NSMutableArray(array: lhs)
let rightMutable = NSMutableArray(array: rhs)
leftMutable.removeObjects(in: rhs)
rightMutable.removeObjects(in: lhs)
let added = rightMutable as! Array<Element>
let removed = leftMutable as! Array<Element>
return ArrayOrderedUpdates(added, removed)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment