   }
 
 
-}
+
+
+  func itemBatchStartingIndexPath(deletionsUpToThisPoint deletionsUpToThisPoint: [[NSIndexPath]], givenIndexPath: NSIndexPath) -> NSIndexPath {
+    var offsetCount = 0 // TODO: Use fancy higher order funcs if possible
+    let deletions = deletionsUpToThisPoint[givenIndexPath.section]
+    for deletion in deletions {
+      if deletion.item < givenIndexPath.item { // TODO: Think more about whether this should be <=
+        offsetCount += 1
+      }
+    }
+    return NSIndexPath(forRow: givenIndexPath.item + offsetCount, inSection: givenIndexPath.section)
+  }
+}
+
+
+
+
+
 
 let cellForItem = { (collectionView: UICollectionView, item: Color, indexPath: NSIndexPath) -> UICollectionViewCell in
   let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath)


          case .DeleteItem(let indexPath):
            // B:
            if sectionStartingRanges[indexPath.section] ~= indexPath.item { // Deleting from existing items
              // This gets complicated, we need to offset any insertions into existing items after this index we are deleting
              sectionDeletions[indexPath.section].insert(indexPath)
              for insertionIndexPath in sectionInsertions[indexPath.section] {
                if insertionIndexPath.item > indexPath.item { // TODO: What if insertion index path matches deletion index path
                  print("deleting an item that is before item that will be insterted into existing items")
                  insertionIndexPath.section
                  insertionIndexPath.item
                  sectionInsertions[indexPath.section].remove(insertionIndexPath)
                  sectionInsertions[indexPath.section].insert(NSIndexPath(forItem: insertionIndexPath.item - 1, inSection: insertionIndexPath.section))

                }
              }

              if let sectionAdditionsForSection = sectionAdditions[indexPath.section] {
                sectionAdditions[indexPath.section] = sectionAdditionsForSection << 1
              }
            } else { // NOT deleting from existing items, no deleting from datasource, items never made it to collection view no need to add these items just to delete them
              if sectionAdditions[indexPath.section] == nil {
                let startingRange = sectionStartingRanges[indexPath.section]
                sectionAdditions[indexPath.section] = startingRange.endIndex..<startingRange.endIndex
              }
              if let sectionAdditionsForSection = sectionAdditions[indexPath.section] {
                sectionAdditions[indexPath.section] = sectionAdditionsForSection - 1 // TODO: Remove addition range if range becomes 0..<0
              }
            } // :B

          case .DeleteItems(let indexPaths):
            for indexPath in indexPaths {
              // B:
              if sectionStartingRanges[indexPath.section] ~= indexPath.item { // Deleting from existing items
                // This gets complicated, we need to offset any insertions into existing items after this index we are deleting
                sectionDeletions[indexPath.section].insert(indexPath)
                for insertionIndexPath in sectionInsertions[indexPath.section] {
                  if insertionIndexPath.item > indexPath.item { // TODO: What if insertion index path matches deletion index path
                    print("deleting an item that is before item that will be insterted into existing items")
                    insertionIndexPath.section
                    insertionIndexPath.item
                    sectionInsertions[indexPath.section].remove(insertionIndexPath)
                    sectionInsertions[indexPath.section].insert(NSIndexPath(forItem: insertionIndexPath.item - 1, inSection: insertionIndexPath.section))

                  }
                }

                if let sectionAdditionsForSection = sectionAdditions[indexPath.section] {
                  sectionAdditions[indexPath.section] = sectionAdditionsForSection << 1
                }
              } else { // NOT deleting from existing items, no deleting from datasource, items never made it to collection view no need to add these items just to delete them
                if sectionAdditions[indexPath.section] == nil {
                  let startingRange = sectionStartingRanges[indexPath.section]
                  sectionAdditions[indexPath.section] = startingRange.endIndex..<startingRange.endIndex
                }
                if let sectionAdditionsForSection = sectionAdditions[indexPath.section] {
                  sectionAdditions[indexPath.section] = sectionAdditionsForSection - 1
                }
              } // :B
            }
          case .DeleteLastItem(let sectionIndex): // Section Index
            if let sectionAdditionsForSection = sectionAdditions[sectionIndex] { // There are additions, just remove from there
              let x = 1
              sectionAdditions[sectionIndex]?.startIndex

    return NSIndexPath(forItem: 0, inSection: 0)
  }

//  interactionHandler.safeDataSource.deleteLastItemInSection(0)
//  interactionHandler.safeDataSource.deleteLastItemInSection(0)
//  interactionHandler.safeDataSource.deleteLastItemInSection(0)
//  interactionHandler.safeDataSource.deleteLastItemInSection(0)
//  interactionHandler.safeDataSource.deleteLastItemInSection(0)
//  interactionHandler.safeDataSource.deleteLastItemInSection(0)
//  interactionHandler.safeDataSource.deleteLastItemInSection(0)
//  interactionHandler.safeDataSource.deleteLastItemInSection(0)
//  interactionHandler.safeDataSource.deleteLastItemInSection(0)
//  interactionHandler.safeDataSource.deleteLastItemInSection(0)
//  interactionHandler.safeDataSource.deleteLastItemInSection(0)
//  interactionHandler.safeDataSource.deleteLastItemInSection(0)
//  interactionHandler.safeDataSource.deleteLastItemInSection(0)
//  interactionHandler.safeDataSource.deleteLastItemInSection(0)
//  interactionHandler.safeDataSource.deleteLastItemInSection(0) // TODO: uncomment and support this use case

}
