public void handleCollectionChanges(IReadOnlyCollection <ICollectionChange> changes)
        {
            lock (animationLock)
            {
                if (changes.Any(c => c is ReloadCollectionChange))
                {
                    tableView.ReloadData();
                    return;
                }

                tableView.BeginUpdates();

                foreach (var change in changes)
                {
                    var affectedSections = new List <int>();

                    switch (change)
                    {
                    case AddRowCollectionChange <TModel> addRow:
                        var addedToSection = add(addRow);
                        affectedSections.Add(addedToSection);
                        break;

                    case InsertSectionCollectionChange <TModel> insert:
                        insertSection(insert);
                        break;

                    case RemoveRowCollectionChange removeRow:
                        var removedFromSection = remove(removeRow);
                        affectedSections.Add(removedFromSection);
                        break;

                    case MoveRowWithinExistingSectionsCollectionChange <TModel> moveRow:
                        var oldAndNewSection = move(moveRow);
                        affectedSections.AddRange(oldAndNewSection);
                        break;

                    case MoveRowToNewSectionCollectionChange <TModel> moveRowToNewSection:
                        var oldSection = move(moveRowToNewSection);
                        affectedSections.Add(oldSection);
                        break;

                    case UpdateRowCollectionChange <TModel> updateRow:
                        var updatedInSection = update(updateRow);
                        affectedSections.Add(updatedInSection);
                        break;
                    }

                    dataSource.ChangeDisplayedCollection(change);

                    affectedSections
                    .Distinct()
                    .Where(index => index < dataSource.NumberOfSections(tableView))
                    .ForEach(index => dataSource.RefreshHeader(tableView, index));
                }

                tableView.EndUpdates();
            }
        }
        private void handleCollectionChange(ICollectionChange change)
        {
            lock (animationLock)
            {
                if (change is ReloadCollectionChange)
                {
                    dataSource.ChangeDisplayedCollection(change);
                    updateTable(change);
                    return;
                }

                tableView.BeginUpdates();

                dataSource.ChangeDisplayedCollection(change);
                var sectionsNeedingHeaderRefresh = updateTable(change);

                tableView.EndUpdates();

                sectionsNeedingHeaderRefresh.ForEach(index =>
                                                     dataSource.RefreshHeader(tableView, index));
            }
        }