public void OnNext(ListChange <IObservable <T> > changes) { lock (_gate) { changes( insert: (index, obs) => { var indexedItem = new IndexTrackerList <SingleAssignmentDisposable> .IndexedItem(new SingleAssignmentDisposable()); _innerSubscriptions.Insert(index, indexedItem); _changeMapper.InsertFalse(index); _innerCompleted = _innerCompleted.Insert(index, false); indexedItem.Value.Disposable = SubscribeInner(obs, indexedItem); }, replace: (index, obs) => { _innerSubscriptions[index].Dispose(); var indexedItem = new IndexTrackerList <SingleAssignmentDisposable> .IndexedItem(new SingleAssignmentDisposable()); _innerSubscriptions.Replace(index, indexedItem); _innerCompleted = _innerCompleted.ReplaceAt(index, false); indexedItem.Value.Disposable = SubscribeInner(obs, indexedItem); // The new observable hasn't produced any values left, so remove any leftover old values foreach (var change in _changeMapper.ReplaceFalse <T>(index)) { _observer.OnNext(change); } }, remove: (index) => { _innerSubscriptions[index].Dispose(); _innerSubscriptions.Remove(index); _innerCompleted = _innerCompleted.RemoveAt(index); foreach (var change in _changeMapper.Remove <T>(index)) { _observer.OnNext(change); } }, clear: () => { Disposable.Combine(_innerSubscriptions).Dispose(); _innerSubscriptions.Clear(); _innerCompleted = SumTree <bool> .Empty(false, (d1, d2) => d1 && d2); foreach (var change in _changeMapper.Clear <T>()) { _observer.OnNext(change); } }); } }
public Optional <ListChange <T> > Replace <T>(int index, T item, bool predicateTrue) { var toIndex = _items.Sum(index); var oldPredicateTrue = _items[index] == 1; _items = _items.ReplaceAt(index, predicateTrue ? 1 : 0); if (predicateTrue) { return(oldPredicateTrue ? ListChange.Replace(toIndex, item) : ListChange.Insert(toIndex, item)); } else { return(oldPredicateTrue ? ListChange.Remove <T>(toIndex) : Optional.None <ListChange <T> >()); } }