示例#1
0
        public static IAsyncEnumerable <TValue> Throw <TValue>(Exception exception)
        {
            if (exception == null)
            {
                throw new ArgumentNullException("exception");
            }

            return(Create(() => Create <TValue>(
                              ct => TaskExt.Throw <bool>(exception, ct),
                              () => { throw new InvalidOperationException(); },
                              () => { })
                          ));
        }
示例#2
0
        public static IAsyncEnumerable <TResult> Generate <TState, TResult>(TState initialState, Func <TState, bool> condition, Func <TState, TState> iterate, Func <TState, TResult> resultSelector)
        {
            if (condition == null)
            {
                throw new ArgumentNullException(nameof(condition));
            }
            if (iterate == null)
            {
                throw new ArgumentNullException(nameof(iterate));
            }
            if (resultSelector == null)
            {
                throw new ArgumentNullException(nameof(resultSelector));
            }

            return(CreateEnumerable(
                       () =>
            {
                var i = initialState;
                var started = false;
                var current = default(TResult);

                return CreateEnumerator(
                    ct =>
                {
                    var b = false;
                    try
                    {
                        if (started)
                        {
                            i = iterate(i);
                        }

                        b = condition(i);

                        if (b)
                        {
                            current = resultSelector(i);
                        }
                    }
                    catch (Exception ex)
                    {
                        return TaskExt.Throw <bool>(ex);
                    }

                    if (!b)
                    {
                        return TaskExt.False;
                    }

                    if (!started)
                    {
                        started = true;
                    }

                    return TaskExt.True;
                },
                    () => current,
                    () => { }
                    );
            }));
        }