public QueryHistoryProvider() { _historySourceList = new SourceList <RawQueryHistory>(); var counter = _historySourceList.CountChanged.Subscribe(i => IsEmpty = i == 0); var limiter = _historySourceList.LimitSizeTo(100).Subscribe(); _historySourceList.AddRange(LoadFileData()); var sharedList = _historySourceList .Connect() .DeferUntilLoaded() .Sort(SortExpressionComparer <RawQueryHistory> .Descending(t => t.LastRunAt)) .ObserveOnDispatcher() .Bind(out _queryHistories) .Subscribe(); var disposable = _queryHistories .ObserveCollectionChanges() .Throttle(TimeSpan.FromSeconds(2)) .Subscribe(pattern => { SaveFileData(_queryHistories); }); _compositeDisposable = new CompositeDisposable(counter, limiter, sharedList, disposable); }
/// <summary> /// Aggregates observables from <paramref name="collection"/> using selector for observables <paramref name="observablePropertySelector"/> /// and aggregator for values from observables <paramref name="aggregator"/> /// </summary> public static IObservable <TRes> AggregateLatest <T, TRes>( this ReadOnlyObservableCollection <T> collection, Func <T, IObservable <TRes> > observablePropertySelector, Func <IList <TRes>, TRes> aggregator) { return(Observable.Create <TRes>(observer => { var aggregateLatestSubscription = collection.AggregateLatest(observablePropertySelector, aggregator, observer); var collectionChangesSubscription = collection.ObserveCollectionChanges().Subscribe(_ => { aggregateLatestSubscription.Dispose(); aggregateLatestSubscription = collection.AggregateLatest(observablePropertySelector, aggregator, observer); }); return Disposable.Create(() => { collectionChangesSubscription.Dispose(); aggregateLatestSubscription.Dispose(); }); })); }