Skip to content

Commit

Permalink
Add an easy way to denest objects, useful for graphql servers
Browse files Browse the repository at this point in the history
  • Loading branch information
nloum committed Oct 14, 2024
1 parent e7d9475 commit 99c1093
Showing 1 changed file with 31 additions and 0 deletions.
31 changes: 31 additions & 0 deletions CodegenBot/DenestExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
namespace CodegenBot;

public class Denested<TItem>
{
public int Depth { get; init; }
public required TItem Item { get; init; }
}

public static class DenestExtensions
{
public static IEnumerable<Denested<TItem>> Denest<TItem>(IEnumerable<TItem> items, Func<TItem, IEnumerable<TItem>> children)
{
return DenestInternal(items, children, 0);
}

private static IEnumerable<Denested<TItem>> DenestInternal<TItem>(IEnumerable<TItem> items, Func<TItem, IEnumerable<TItem>> children, int depth)
{
foreach (var item in items)
{
yield return new Denested<TItem> { Depth = depth, Item = item };
var childItems = children(item);
if (childItems != null)
{
foreach (var denestedChild in DenestInternal(childItems, children, depth + 1))
{
yield return denestedChild;
}
}
}
}
}

0 comments on commit 99c1093

Please sign in to comment.