public IObservable <IChangeSet <TObject, TKey> > Run() { return(Observable.Create <IChangeSet <TObject, TKey> >(observer => { var sizeLimiter = new SizeLimiter <TObject, TKey>(_size); var root = new IntermediateCache <TObject, TKey>(_source); var subscriber = root.Connect() .Transform((t, v) => new ExpirableItem <TObject, TKey>(t, v, DateTime.Now)) .Select(changes => { var result = sizeLimiter.Change(changes); var removes = result.Where(c => c.Reason == ChangeReason.Remove); root.Edit(updater => removes.ForEach(c => updater.Remove(c.Key))); return result; }) .Finally(observer.OnCompleted) .SubscribeSafe(observer); return Disposable.Create(() => { subscriber.Dispose(); root.Dispose(); }); })); }
public IObservable <IChangeSet <TObject, TKey> > ExpireAfter() { return(Observable.Create <IChangeSet <TObject, TKey> >(observer => { var cache = new IntermediateCache <TObject, TKey>(_source); var published = cache.Connect().Publish(); var subscriber = published.SubscribeSafe(observer); var autoRemover = published.ForExpiry(_timeSelector, _interval, _scheduler) .Finally(observer.OnCompleted) .Subscribe(keys => { try { cache.Edit(updater => updater.Remove(keys.Select(kv => kv.Key))); } catch (Exception ex) { observer.OnError(ex); } }); var connected = published.Connect(); return Disposable.Create(() => { connected.Dispose(); subscriber.Dispose(); autoRemover.Dispose(); cache.Dispose(); }); })); }
public IObservable <IChangeSet <T, TKey> > Run() { return(Observable.Create <IChangeSet <T, TKey> >(observer => { var cache = new IntermediateCache <T, TKey>(_source); var published = cache.Connect().Publish(); var subscriber = published.SubscribeSafe(observer); var remover = _evaluator.Finally(observer.OnCompleted) .Subscribe(_ => { try { cache.Clear(); } catch (Exception ex) { observer.OnError(ex); } }); var connected = published.Connect(); return new CompositeDisposable { connected, subscriber, remover, cache }; })); }