 				return nil
 			}
 			
-			return IndexPath(row: index, section: 0)
+			return IndexPath(row: index, section: section)
 		})
 		
 		self.moves = differences.compactMap({ difference -> (IndexPath, IndexPath)? in

	case deletion(index: Int)
	case move(source: Int, destination: Int)
	
	public static func calculate<Element: Equatable>(old: [Element], new: [Element]) -> [Difference] {
		let similarities = new
			.filter({ old.contains($0) })
			.map({ Difference.none(index: new.index(of: $0)!) })

}

public extension UICollectionView {
	public func reload(using differences: [Difference], in section: Int) {
		let indexes = Update(from: differences, in: section)
		
		self.performBatchUpdates({
			self.insertItems(at: indexes.insertions)
			self.deleteItems(at: indexes.deletions)
			
			indexes.moves.forEach({ self.moveItem(at: $0.source, to: $0.destination) })
		}, completion: nil)
	}
}

public extension UITableView {
	public func reload(using differences: [Difference], in section: Int, with animation: UITableViewRowAnimation) {
		let indexes = Update(from: differences, in: section)
		
		self.beginUpdates()
		self.insertRows(at: indexes.insertions, with: animation)
		self.deleteRows(at: indexes.deletions, with: animation)
		
		indexes.moves.forEach({ self.moveRow(at: $0.source, to: $0.destination) })
		
		self.endUpdates()
	}
}

private struct Update {
	public init(from differences: [Difference], in section: Int) {
		self.insertions = differences.compactMap({ difference -> IndexPath? in
			guard case let .insertion(index) = difference else {
				return nil
			}
			
			return IndexPath(row: index, section: section)
		})
		
		self.deletions = differences.compactMap({ difference -> IndexPath? in
