Esempio n. 1
0
        public async ValueTask SubscribeAsync(IAsyncObserver <T> observer)
        {
            var disposable = new BooleanDisposable();

            await observer.OnSubscribeAsync(disposable).ConfigureAwait(false);

            if (!disposable.IsDisposed)
            {
                await observer.OnErrorAsync(_exception).ConfigureAwait(false);
            }

            await observer.OnFinallyAsync().ConfigureAwait(false);
        }
Esempio n. 2
0
        public async ValueTask SubscribeAsync(IAsyncObserver <T> observer)
        {
            var disposable = new BooleanDisposable();

            await observer.OnSubscribeAsync(disposable).ConfigureAwait(false);

            try
            {
                if (!disposable.IsDisposed)
                {
                    await observer.OnCompletedAsync().ConfigureAwait(false);
                }
            }
            finally
            {
                await observer.OnFinallyAsync().ConfigureAwait(false);
            }
        }
Esempio n. 3
0
        public async ValueTask SubscribeAsync(IAsyncObserver <T> observer)
        {
            var disposable = new AwaitableDisposable();

            await observer.OnSubscribeAsync(disposable).ConfigureAwait(false);

            try
            {
                // AwaitableDisposable will not throw, hence we
                // do not need to follow the try finally pattern.
                // We do it nonetheless to be consistent.
                await disposable.Task.ConfigureAwait(false);
            }
            finally
            {
                await observer.OnFinallyAsync().ConfigureAwait(false);
            }
        }
Esempio n. 4
0
        public async ValueTask SubscribeAsync(IAsyncObserver <T> observer)
        {
            var disposable = new BooleanDisposable();

            try
            {
                await observer.OnSubscribeAsync(disposable).ConfigureAwait(false);

                var items = await _enumerable.ConfigureAwait(false);

                foreach (var item in items)
                {
                    if (disposable.IsDisposed)
                    {
                        break;
                    }

                    var t = observer.OnNextAsync(item);

                    try
                    {
                        await t.ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        await observer.OnErrorAsync(ex).ConfigureAwait(false);

                        break;
                    }
                }

                if (!disposable.IsDisposed)
                {
                    await observer.OnCompletedAsync().ConfigureAwait(false);
                }
            }
            finally
            {
                await observer.OnFinallyAsync().ConfigureAwait(false);
            }
        }
        public async ValueTask SubscribeAsync(IAsyncObserver <T> observer)
        {
            var disposable = new SerialDisposable();

            await observer.OnSubscribeAsync(disposable).ConfigureAwait(false);

            foreach (var obs in _observables)
            {
                if (disposable.IsDisposed)
                {
                    break;
                }

                var inner = new Observer(observer);

                try
                {
                    await obs.SubscribeAsync(inner).ConfigureAwait(false);
                }
                catch (Exception ex)
                {
                    await observer.OnErrorAsync(ex).ConfigureAwait(false);

                    disposable.Dispose();
                    break;
                }

                if (inner.Faulted)
                {
                    disposable.Dispose();
                    break;
                }
            }

            if (!disposable.IsDisposed)
            {
                await observer.OnCompletedAsync().ConfigureAwait(false);
            }

            await observer.OnFinallyAsync().ConfigureAwait(false);
        }
Esempio n. 6
0
        public async ValueTask SubscribeAsync(IAsyncObserver <int> observer)
        {
            var disposable = new BooleanDisposable();

            await observer.OnSubscribeAsync(disposable).ConfigureAwait(false);

            try
            {
                for (int i = _start; i < _end; i++)
                {
                    if (disposable.IsDisposed)
                    {
                        break;
                    }

                    var t = observer.OnNextAsync(i);

                    try
                    {
                        await t.ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        await observer.OnErrorAsync(ex).ConfigureAwait(false);

                        break;
                    }
                }

                if (!disposable.IsDisposed)
                {
                    await observer.OnCompletedAsync().ConfigureAwait(false);
                }
            }
            finally
            {
                await observer.OnFinallyAsync().ConfigureAwait(false);
            }
        }
Esempio n. 7
0
        public async ValueTask SubscribeAsync(IAsyncObserver <T> observer)
        {
            var disposable = new BooleanDisposable();

            await observer.OnSubscribeAsync(disposable).ConfigureAwait(false);

            try
            {
                if (disposable.IsDisposed)
                {
                    return;
                }

                var t = observer.OnNextAsync(_value);

                try
                {
                    await t.ConfigureAwait(false);
                }
                catch (Exception ex)
                {
                    if (!disposable.IsDisposed)
                    {
                        await observer.OnErrorAsync(ex).ConfigureAwait(false);
                    }
                    return;
                }

                if (!disposable.IsDisposed)
                {
                    await observer.OnCompletedAsync().ConfigureAwait(false);
                }
            }
            finally
            {
                await observer.OnFinallyAsync().ConfigureAwait(false);
            }
        }
 public virtual ValueTask OnSubscribeAsync(IDisposable disposable)
 {
     SetUpstream(disposable);
     return(_downstream.OnSubscribeAsync(this));
 }
Esempio n. 9
0
            public async ValueTask Run()
            {
                await _observer.OnSubscribeAsync(this).ConfigureAwait(false);

                try
                {
                    var done = false;

                    while (true)
                    {
                        while (true)
                        {
                            if (IsCanceled)
                            {
                                return;
                            }

                            done = Volatile.Read(ref _done);

                            if (_queue.TryDequeue(out var item))
                            {
                                var t = _observer.OnNextAsync(item);

                                try
                                {
                                    await t.ConfigureAwait(false);
                                }
                                catch (Exception ex)
                                {
                                    await _observer.OnErrorAsync(ex).ConfigureAwait(false);

                                    return;
                                }
                            }
                            else
                            {
                                break;
                            }
                        }

                        if (done)
                        {
                            break;
                        }

                        await ResumeHelper.Await(ref _tcs).ConfigureAwait(false);

                        ResumeHelper.Clear(ref _tcs);
                    }

                    if (!IsCanceled)
                    {
                        if (_error == null)
                        {
                            await _observer.OnCompletedAsync().ConfigureAwait(false);
                        }
                        else
                        {
                            await _observer.OnErrorAsync(_error).ConfigureAwait(false);
                        }
                    }

                    Dispose();
                }
                finally
                {
                    await _observer.OnFinallyAsync().ConfigureAwait(false);
                }
            }