public IDisposable Subscribe(IObserver <ListChange <T> > observer) { var mapper = new WhereChangeMapper(); var gate = new object(); return(_source.Subscribe( Observer.Create <ListChange <T> >( onNext: change => { lock (gate) { var newChanges = new List <ListChange <T> >(); change( insert: (index, item) => newChanges.AddRange(mapper.Insert(index, item, _predicate(item))), replace: (index, item) => newChanges.AddRange(mapper.Replace(index, item, _predicate(item))), remove: index => newChanges.AddRange(mapper.Remove <T>(index)), clear: () => newChanges.AddRange(mapper.Clear <T>())); if (newChanges.Count > 0) { observer.OnNext(ListChange.Combine(newChanges)); } } }, onCompleted: observer.OnCompleted, onError: observer.OnError))); }