public static IObservable <IObservable <TSource> > Window <TSource> ( this IObservable <TSource> source, TimeSpan timeSpan, int count, IScheduler scheduler) { var counter = new Subject <Unit> (); var sub = new Subject <IObservable <TSource> > (); var l = new Subject <TSource> (); var dis = source.Subscribe(Observer.Create <TSource> ( v => { l.OnNext(v); counter.OnNext(Unit.Default); }, ex => sub.OnError(ex), () => { sub.OnNext(l); sub.OnCompleted(); })); var buffer = new TimeOrCountObservable(timeSpan, counter, count, scheduler); var bdis = buffer.Subscribe(Observer.Create <Unit> ( u => { var n = l; l = new Subject <TSource> (); sub.OnNext(n); }, ex => sub.OnError(ex), () => {})); return(new WrappedSubject <IObservable <TSource> > (sub, Disposable.Create(() => { dis.Dispose(); bdis.Dispose(); }))); }
public static IObservable <IObservable <TSource> > Window <TSource> ( this IObservable <TSource> source, TimeSpan timeSpan, int count, IScheduler scheduler) { if (source == null) { throw new ArgumentNullException("source"); } if (scheduler == null) { throw new ArgumentNullException("scheduler"); } return(new ColdObservableEach <IObservable <TSource> > (sub => { // ---- var counter = new Subject <Unit> (); var l = new Subject <TSource> (); var dis = new CompositeDisposable(); dis.Add(source.Subscribe( v => { l.OnNext(v); counter.OnNext(Unit.Default); }, ex => sub.OnError(ex), () => { sub.OnNext(l); sub.OnCompleted(); })); var buffer = new TimeOrCountObservable(timeSpan, counter, count, scheduler); dis.Add(buffer.Subscribe(u => { var n = l; l = new Subject <TSource> (); sub.OnNext(n); }, ex => sub.OnError(ex), () => {})); return dis; // ---- }, scheduler)); }