 }
 
 extension UITableView {
-    private final func _performBatchUpdates(_ updates: @escaping () -> (), completion: ((Bool) -> ())? = nil) {
+    private final func _performBatchUpdates(_ updates: () -> (), completion: ((Bool) -> ())? = nil) {
         if #available(
             iOS 11, iOSApplicationExtension 11,
             tvOS 11, tvOSApplicationExtension 11,

                    toAddSections.insert(idx)
                }
            }
            self.insertSections(toAddSections, with: animation)
            self.reloadSections(toReloadSections, with: animation)
        }) { _ in
            self._performBatchUpdates({
                // Move and update sections

        let toAddIndexPaths = toAdd.map { IndexPath(row: $0.offset, section: section) }
        insertRows(at: toAddIndexPaths, with: animation)
    }

    private final func moveAndReload<Row: Equatable>(from oldRows: [Row], to newRows: [Row], withPreviousResults results: [Row], in section: Int, with animation: RowAnimation, rowNeedsReload: (Row, Row) -> Bool) {
        var indexPathsToReload: [IndexPath] = []
        for (idx, row) in newRows.enumerated() where oldRows.contains(row) {
            guard let oldIdx = results.firstIndex(of: row) else { continue }
            let newIndexPath = IndexPath(row: idx, section: section)
            if oldIdx != idx {
                moveRow(at: IndexPath(row: oldIdx, section: section), to: newIndexPath)
            }
            if rowNeedsReload(results[oldIdx], row) {
                indexPathsToReload.append(newIndexPath)
            }
        }
        if !indexPathsToReload.isEmpty {
            reloadRows(at: indexPathsToReload, with: animation)
        }
    }

    private final func moveAndReload<Row: UITableViewReloadableObject>(from oldRows: [Row], to newRows: [Row], withPreviousResults results: [Row], in section: Int, with animation: RowAnimation) {
        moveAndReload(from: oldRows, to: newRows, withPreviousResults: results, in: section, with: animation, rowNeedsReload: { $1.needsReload(from: $0) })
    }
    
    private final func move<Row: Equatable>(from oldRows: [Row], to newRows: [Row], withPreviousResults results: [Row], in section: Int, with animation: RowAnimation) {
        moveAndReload(from: oldRows, to: newRows, withPreviousResults: results, in: section, with: animation, rowNeedsReload: { _, _ in false })
    }
}
