123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- // Licensed to the .NET Foundation under one or more agreements.
- // The .NET Foundation licenses this file to you under the Apache 2.0 License.
- // See the LICENSE file in the project root for more information.
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Threading.Tasks;
- namespace System.Linq
- {
- public static partial class AsyncEnumerable
- {
- 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,
- () => { }
- );
- });
- }
- }
- }
|