// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
namespace ICSharpCode.Core
{
internal static class ExtensionMethods
{
///
/// Converts a recursive data structure into a flat list.
///
/// The root elements of the recursive data structure.
/// The function that gets the children of an element.
/// Iterator that enumerates the tree structure in preorder.
public static IEnumerable Flatten(this IEnumerable input, Func> recursion)
{
Stack> stack = new Stack>();
try {
stack.Push(input.GetEnumerator());
while (stack.Count > 0) {
while (stack.Peek().MoveNext()) {
T element = stack.Peek().Current;
yield return element;
IEnumerable children = recursion(element);
if (children != null) {
stack.Push(children.GetEnumerator());
}
}
stack.Pop().Dispose();
}
} finally {
while (stack.Count > 0) {
stack.Pop().Dispose();
}
}
}
}
}