     /// 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>]) {
+    override public func processChanges(newState: SectionedValues<Section, Value>, diff: [DiffStep2D<Section, Value>]) {
         guard let tableView = self.tableView else { return }
         tableView.beginUpdates()
         self._rowsAndSections = newState

    }
}

public class CollectionViewDiffCalculator<S: Equatable, T: Equatable> : AbstractDiffCalculator<S, T> {

    public weak var collectionView: UICollectionView?

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

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

        return self.rowsAndSections[section].1.count
    }

    public func value(atIndexPath indexPath: IndexPath) -> Value {
        return self.rowsAndSections[indexPath.section].1[indexPath.row]
    }

    // Since UICollectionView (unlike UITableView) takes a block which must update its data source and trigger animations, we need to trigger the changes on set, instead of explicitly before and after set. This backing array lets us use a getter/setter in the exposed property. TODO
    public var rowsAndSections : SectionedValues<Section, Value> {
        get {
            return _rowsAndSections
        }
