 
 import UIKit
 
-class AbstractDiffCalculator<S: Equatable, T:Equatable> {
+class AbstractDiffCalculator<Section: Equatable, Value: Equatable> {
 
-    init(initialRowsAndSections: SectionedValues<S, T>) {
+    init(initialRowsAndSections: SectionedValues<Section, Value>) {
         self._rowsAndSections = initialRowsAndSections
     }
 

    /// You can change insertion/deletion animations like this! Fade works well. So does Top/Bottom. Left/Right/Middle are a little weird, but hey, do your thing.
    public var insertionAnimation = UITableViewRowAnimation.automatic, deletionAnimation = UITableViewRowAnimation.automatic

    override public func processChanges(newState: SectionedValues<S, T>, diff: [DiffStep2D<S, T>]) {
        guard let tableView = self.tableView else { return }
        tableView.beginUpdates()
        self._rowsAndSections = newState

    }
}

public class CollectionViewDiffCalculator<Section: Equatable, Value: Equatable> : AbstractDiffCalculator<Section, Value> {

    public weak var collectionView: UICollectionView?

    public init(collectionView: UICollectionView, initialRowsAndSections: SectionedValues<Section, Value> = SectionedValues()) {
        self.collectionView = collectionView
        super.init(initialRowsAndSections: initialRowsAndSections)
    }

    override func processChanges(newState: SectionedValues<Section, Value>, diff: [DiffStep2D<Section, Value>]) {
        guard let collectionView = self.collectionView else { return }
        self._rowsAndSections = newState
        collectionView.performBatchUpdates({
