public IObservable <IChangeSet <T> > Run() { return(_source.Select(changes => { _filtered.Filter(changes, _predicate); return _filtered.CaptureChanges(); }) .NotEmpty()); }
public IObservable <IChangeSet <T> > Run() { return(Observable.Create <IChangeSet <T> >(observer => { var filtered = new ChangeAwareList <T>(); return _source.Select(changes => { filtered.Filter(changes, _predicate); return filtered.CaptureChanges(); }).NotEmpty().SubscribeSafe(observer); })); }
public IObservable <IChangeSet <T> > Run() { return(Observable.Create <IChangeSet <T> >(observer => { var allWithMatch = new List <ItemWithMatch>(); var all = new List <T>(); var filtered = new ChangeAwareList <T>(); var locker = new object(); //requery wehn controller either fires changed or requery event var refresher = _predicates.Synchronize(locker) .Select(predicate => { Requery(predicate, allWithMatch, all, filtered); var changed = filtered.CaptureChanges(); return changed; }); var shared = _source.Synchronize(locker).Publish(); //take current filter state of all items var updateall = shared.Synchronize(locker) .Transform(t => new ItemWithMatch(t, _predicate(t))) .Subscribe(allWithMatch.Clone); //filter result list var filter = shared.Synchronize(locker) .Select(changes => { filtered.Filter(changes, _predicate); var changed = filtered.CaptureChanges(); return changed; }); var subscriber = refresher.Merge(filter).NotEmpty().SubscribeSafe(observer); return new CompositeDisposable(updateall, subscriber, shared.Connect()); })); }