Пример #1
0
        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(); })));
        }
Пример #2
0
        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));
        }