示例#1
0
            public async ValueTask <bool> MoveNextAsync()
            {
                for (; ;)
                {
                    var d = _done;
                    var v = Interlocked.Exchange(ref _latest, EmptyHelper.EmptyIndicator);

                    if (d && v == EmptyHelper.EmptyIndicator)
                    {
                        if (_error != null)
                        {
                            throw _error;
                        }
                        return(false);
                    }

                    if (v != EmptyHelper.EmptyIndicator)
                    {
                        Current = (T)v;
                        return(true);
                    }

                    await ResumeHelper.Await(ref _resume);

                    ResumeHelper.Clear(ref _resume);
                }
            }
            public async ValueTask <bool> MoveNextAsync()
            {
                for (; ;)
                {
                    var d       = _done;
                    var success = _queue.TryDequeue(out var v);

                    if (d && !success)
                    {
                        if (_error != null)
                        {
                            throw _error;
                        }
                        return(false);
                    }

                    if (success)
                    {
                        Current = v;
                        return(true);
                    }

                    await ResumeHelper.Await(ref _resume);

                    ResumeHelper.Clear(ref _resume);
                }
            }
示例#3
0
            public async ValueTask <bool> MoveNextAsync()
            {
                for (; ;)
                {
                    var d       = _done && Volatile.Read(ref _inners).Length == 0;
                    var success = _queue.TryDequeue(out var v);

                    if (d && !success)
                    {
                        if (_errors != null)
                        {
                            throw _errors;
                        }
                        return(false);
                    }

                    if (success)
                    {
                        if (v.HasValue)
                        {
                            Current = v.Value;
                            v.Sender.ConsumedOne();
                            return(true);
                        }

                        Remove(v.Sender);
                        NextSource();
                        continue;
                    }

                    await ResumeHelper.Await(ref _resume);

                    ResumeHelper.Clear(ref _resume);
                }
            }
示例#4
0
 public ValueTask DisposeAsync()
 {
     if (Interlocked.Increment(ref _disposeWip) == 1)
     {
         return(_source.DisposeAsync());
     }
     return(ResumeHelper.Await(ref _disposeTask));
 }
示例#5
0
 public ValueTask DisposeAsync()
 {
     _cts.Cancel();
     if (Interlocked.Increment(ref _disposeWip) == 1)
     {
         Interlocked.Exchange(ref _timerLatest, EmptyHelper.EmptyIndicator);
         return(_source.DisposeAsync());
     }
     return(ResumeHelper.Await(ref _disposeTask));
 }
            public async ValueTask <bool> MoveNextAsync()
            {
                for (; ;)
                {
                    var d = _sourceDone;
                    var v = _sourceReady;
                    if (d)
                    {
                        var ex = _sourceError;
                        if (ex != null)
                        {
                            throw ex;
                        }
                        if (!v)
                        {
                            return(false);
                        }
                    }
                    d = _otherDone;
                    var o = Volatile.Read(ref _otherValue);
                    if (d)
                    {
                        var ex = _otherError;
                        if (ex != null)
                        {
                            throw ex;
                        }
                        if (o == EmptyHelper.EmptyIndicator)
                        {
                            return(false);
                        }
                    }

                    if (v)
                    {
                        _sourceReady = false;
                        if (o == EmptyHelper.EmptyIndicator)
                        {
                            MoveNextMain();
                            continue;
                        }

                        Current = _func(_sourceValue, (TOther)o);

                        MoveNextMain();
                        return(true);
                    }

                    await ResumeHelper.Await(ref _resume);

                    ResumeHelper.Clear(ref _resume);
                }
            }
示例#7
0
 public ValueTask DisposeAsync()
 {
     CancellationHelper.Cancel(ref _cts);
     if (Interlocked.Increment(ref _disposeWip) == 1)
     {
         if (_emitLast)
         {
             _emitLastItem = default;
         }
         return(_source.DisposeAsync());
     }
     return(ResumeHelper.Await(ref _disposeTask));
 }
            public async ValueTask <bool> MoveNextAsync()
            {
                for (; ;)
                {
                    var d    = _sourceDone;
                    var curr = _currentInner;
                    if (curr == null)
                    {
                        if (_inners.TryDequeue(out curr))
                        {
                            _currentInner = curr;
                        }
                    }

                    if (d && curr == null)
                    {
                        var ex = _error;
                        if (ex != null)
                        {
                            _error = null;
                            throw ex;
                        }
                        return(false);
                    }
                    if (curr != null)
                    {
                        d = curr.Done;
                        var success = curr.Queue.TryDequeue(out var v);

                        if (d && !success)
                        {
                            curr.Dispose();
                            _currentInner = null;
                            SourceConsumedOne();
                            continue;
                        }

                        if (success)
                        {
                            Current = v;
                            curr.ConsumedOne();
                            return(true);
                        }
                    }

                    await ResumeHelper.Await(ref _resume);

                    ResumeHelper.Clear(ref _resume);
                }
            }
示例#9
0
            public async ValueTask <bool> MoveNextAsync()
            {
                for (; ;)
                {
                    var d    = _done;
                    var curr = Volatile.Read(ref _current);

                    if (d && curr == null)
                    {
                        var ex = _error;
                        if (ex != null)
                        {
                            _error = null;
                            throw ex;
                        }
                        return(false);
                    }

                    if (curr != null)
                    {
                        d = curr.Done;
                        if (curr.HasValue)
                        {
                            Current       = curr.Value;
                            curr.Value    = default;
                            curr.HasValue = false;
                            if (curr == Volatile.Read(ref _current))
                            {
                                curr.MoveNext();
                            }
                            return(true);
                        }
                        if (d)
                        {
                            if (Interlocked.CompareExchange(ref _current, null, curr) == curr)
                            {
                                curr.Dispose();
                            }
                            continue;
                        }
                    }

                    await ResumeHelper.Await(ref _resume);

                    ResumeHelper.Clear(ref _resume);
                }
            }
            public async ValueTask Next(T value)
            {
                if (_disposeRequested)
                {
                    return;
                }
                await ResumeHelper.Await(ref _consumed);

                ResumeHelper.Clear(ref _consumed);
                if (_disposeRequested)
                {
                    return;
                }

                Current   = value;
                _hasValue = true;

                ResumeHelper.Resume(ref _valueReady);
            }
示例#11
0
            public async ValueTask <bool> MoveNextAsync()
            {
                for (; ;)
                {
                    var d       = _done;
                    var success = _queue.TryDequeue(out var v);

                    if (d && !success)
                    {
                        if (_error != null)
                        {
                            throw _error;
                        }
                        return(false);
                    }

                    if (success)
                    {
                        Current = v;

                        var c = _consumed + 1;
                        if (c == _limit)
                        {
                            _consumed = 0;
                            if (Interlocked.Add(ref _outstanding, c) == c)
                            {
                                MoveNext();
                            }
                        }
                        else
                        {
                            _consumed = c;
                        }

                        return(true);
                    }

                    await ResumeHelper.Await(ref _resume);

                    ResumeHelper.Clear(ref _resume);
                }
            }
            internal void SetTask(Task task)
            {
                _task = task.ContinueWith(async t =>
                {
                    if (_disposeRequested)
                    {
                        return;
                    }
                    await ResumeHelper.Await(ref _consumed);
                    ResumeHelper.Clear(ref _consumed);
                    if (_disposeRequested)
                    {
                        return;
                    }

                    _error = ExceptionHelper.Extract(t.Exception);

                    ResumeHelper.Resume(ref _valueReady);
                }, Token);
            }
示例#13
0
            public async ValueTask <bool> MoveNextAsync()
            {
                if (!_once)
                {
                    _once = true;
                    foreach (var inner in _sources)
                    {
                        inner.MoveNext();
                    }
                }
                for (; ;)
                {
                    var d       = Volatile.Read(ref _done) == 0;
                    var success = _queue.TryDequeue(out var v);

                    if (d && !success)
                    {
                        var ex = _error;
                        if (ex != null)
                        {
                            _error = null;
                            throw ex;
                        }
                        return(false);
                    }

                    if (success)
                    {
                        Current = v.Value;
                        v.Sender.MoveNext();
                        return(true);
                    }

                    await ResumeHelper.Await(ref _resume);

                    ResumeHelper.Clear(ref _resume);
                }
            }
            public async ValueTask <bool> MoveNextAsync()
            {
                ResumeHelper.Resume(ref _consumed);

                await ResumeHelper.Await(ref _valueReady);

                ResumeHelper.Clear(ref _valueReady);
                if (_hasValue)
                {
                    _hasValue = false;
                    return(true);
                }
                Current = default;

                var ex = _error;

                if (ex != null)
                {
                    _error = null;
                    throw ex;
                }
                return(false);
            }
示例#15
0
            public async ValueTask <bool> MoveNextAsync()
            {
                for (; ;)
                {
                    _cts.Token.ThrowIfCancellationRequested();
                    var a = Volatile.Read(ref _available);
                    var b = _index;

                    if (a != b)
                    {
                        Current = b;
                        _index  = b + 1;
                        return(true);
                    }
                    if (b == _end)
                    {
                        return(false);
                    }

                    await ResumeHelper.Await(ref _resume);

                    ResumeHelper.Clear(ref _resume);
                }
            }
示例#16
0
            public async ValueTask <bool> MoveNextAsync()
            {
                if (!_once)
                {
                    _once = true;
                    MoveNextAll();
                }

                var latest = _latest;
                var n      = latest.Length;

                for (; ;)
                {
                    if (_done == 0)
                    {
                        var ex = ExceptionHelper.Terminate(ref _error);
                        if (ex != null)
                        {
                            throw ex;
                        }
                        return(false);
                    }

                    var success = _queue.TryDequeue(out var entry);

                    if (success)
                    {
                        var inner = _sources[entry.Index];

                        if (entry.Done)
                        {
                            if (inner.HasLatest)
                            {
                                _done--;
                            }
                            else
                            {
                                _done = 0;
                            }
                            continue;
                        }

                        if (!inner.HasLatest)
                        {
                            inner.HasLatest = true;
                            _latestRemaining--;
                        }

                        latest[entry.Index] = entry.Value;

                        if (_latestRemaining == 0)
                        {
                            var copy = new TSource[n];
                            Array.Copy(latest, 0, copy, 0, n);

                            Current = _combiner(copy);

                            inner.MoveNext();
                            return(true);
                        }

                        inner.MoveNext();
                        continue;
                    }

                    await ResumeHelper.Await(ref _resume);

                    ResumeHelper.Clear(ref _resume);
                }
            }