public LogSourceService() { _logEventsLock = new object(); _sourcesLock = new object(); _sources = new ObservableCowList <ILogSource>(); _logEvents = new ObservableCowList <LogEvent>(); Sources = _sources; LogEvents = _logEvents; }
public LogFilterResultsService(ILogSourceService logSourceService, ILogFilterService logFilterService) { _logEvents = new ObservableCowList <LogEvent>(); Result = _logEvents; var sourceLogEvents = logSourceService.LogEvents.AsBehaviorObservable().Publish(); var filterChanges = logFilterService.Filter.Publish(); var sourceResetEvents = sourceLogEvents.Where(e => e.Action == NotifyListChangedAction.Reset).Select(e => e.Items); Observable.Merge( Observable.WithLatestFrom( sourceResetEvents, filterChanges, (items, filter) => (items, filter) ), Observable.WithLatestFrom( filterChanges, sourceLogEvents.Select(e => e.Items), (filter, items) => (items, filter) ) ) .Select(x => { (var items, var filter) = x; return(Observable.Concat( InvokeFilter(NotifyListChangedAction.Reset, items, filter), sourceLogEvents .TakeWhile(e => e.Action == NotifyListChangedAction.Add) .Select(e => InvokeFilter(e.Action, e.NewItems, filter)) .SelectMany(a => a) )); }) .Switch().Subscribe(x => { (var action, var items) = x; switch (action) { case NotifyListChangedAction.Add: _logEvents.Add(items); break; case NotifyListChangedAction.Reset: _logEvents.Reset(items); break; default: throw new NotSupportedException(); } }); filterChanges.Connect(); sourceLogEvents.Connect(); }
public LogFilterService() { _filter = new BehaviorSubject <Func <LogEvent, bool> >(LogFilter.PassAll); _filters = new ObservableCowList <IObservable <Func <LogEvent, bool> > >(); _filters .AsItemsBehaviorObservable() .Select(items => items.CombineLatest(CombineFilters)) .Switch() .DistinctUntilChanged() .Subscribe(_filter); Filter = _filter.AsObservable(); }