// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT License.
// See the LICENSE file in the project root for more information.
using System.Collections.Generic;
namespace System.Linq
{
public static partial class EnumerableEx
{
///
/// Generates a sequence by mimicking a for loop.
///
/// State type.
/// Result sequence element type.
/// Initial state of the generator loop.
/// Loop condition.
/// State update function to run after every iteration of the generator loop.
/// Result selector to compute resulting sequence elements.
/// Sequence obtained by running the generator loop, yielding computed elements.
public static IEnumerable Generate(TState initialState, Func condition, Func iterate, Func 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 GenerateCore(initialState, condition, iterate, resultSelector);
}
private static IEnumerable GenerateCore(TState initialState, Func condition, Func iterate, Func resultSelector)
{
for (var i = initialState; condition(i); i = iterate(i))
{
yield return resultSelector(i);
}
}
}
}