public void OnError(Exception error) { lock (_gate) { _observer.OnError(error); Disposable.Combine(_innerSubscriptions).Dispose(); _innerSubscriptions.Clear(); _innerCompleted = SumTree <bool> .Empty(false, (d1, d2) => d1 && d2); } }
public static IObservable <T> AggregateAssoc <T>( this IObservableList <T> self, T seed, Func <T, T, T> associativeAccumulator) { return(self .Scan( SumTree <T> .Empty(seed, associativeAccumulator), (tree, changes) => changes.Apply(tree)) .Select(tree => tree.Sum())); }
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); } }); } }