Example #1
0
        private bool MoveNext()
        {
            TSource item;

            if (_enumerator == null)
            {
                return(false);
            }

            lock (_enumerator)
            {
                if (!_enumerator.MoveNext())
                {
                    _enumerator.Dispose();
                    _cancellationTokenSource.Cancel();
                    _enumerator = null;
                    return(false);
                }

                item = _enumerator.Current;
            }

            var key     = _keySelector(item);
            var element = _resultSelector(item);

            if (_proxies.TryGetOrAdd(key, _ => new ProxyObservable <TElement>(), out var proxy))
            {
                var progressor = Progressor <TElement> .CreateFromIObservable
                                 (
                    proxy,
                    Advance,
                    _cancellationTokenSource.Token
                                 );

                var items = ProgressiveCollection <TElement> .Create
                            (
                    progressor,
                    new ThreadSafeCollection <TElement>(),
                    EqualityComparer <TElement> .Default
                            );

                var result = new Grouping <TKey, TElement>(key, items);
                _results.Add(result);
            }

            proxy.OnNext(element);
            return(true);
        }