Ejemplo n.º 1
0
 public IObservable <IChangeSet <T> > Run()
 {
     return(_source.Select(changes =>
     {
         _filtered.Filter(changes, _predicate);
         return _filtered.CaptureChanges();
     })
            .NotEmpty());
 }
Ejemplo n.º 2
0
 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);
     }));
 }
Ejemplo n.º 3
0
        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());
            }));
        }