46 lines
1.4 KiB
C#
46 lines
1.4 KiB
C#
|
using InnovEnergy.Lib.Utils;
|
||
|
using Sawmill;
|
||
|
|
||
|
namespace InnovEnergy.Lib.SrcGen.Trees;
|
||
|
|
||
|
|
||
|
public class ForwardTree<T> : IRewritable<ForwardTree<T>> where T : notnull
|
||
|
{
|
||
|
public T Node { get; }
|
||
|
public IReadOnlyList<ForwardTree<T>> Children { get; }
|
||
|
public Boolean IsLeaf => Children.Count == 0;
|
||
|
|
||
|
public ForwardTree(T node) : this(node, Array.Empty<ForwardTree<T>>())
|
||
|
{
|
||
|
}
|
||
|
|
||
|
public ForwardTree(T node, IReadOnlyList<ForwardTree<T>> children)
|
||
|
{
|
||
|
Node = node;
|
||
|
Children = children;
|
||
|
}
|
||
|
|
||
|
public ForwardTree<T> WithNode(T node) => new ForwardTree<T>(node, Children);
|
||
|
public ForwardTree<T> WithNode(Func<T, T> makeNode) => new ForwardTree<T>(makeNode(Node), Children);
|
||
|
|
||
|
public override String ToString()
|
||
|
{
|
||
|
var node = Node.ToString()!;
|
||
|
return Children.Aggregate(node, (s, c) => s + "\n" + c.ToString().Indent(node.Length));
|
||
|
}
|
||
|
|
||
|
Int32 IRewritable<ForwardTree<T>>.CountChildren() => Children.Count;
|
||
|
|
||
|
void IRewritable<ForwardTree<T>>.GetChildren(Span<ForwardTree<T>> childrenReceiver)
|
||
|
{
|
||
|
for (var i = 0; i < Children.Count; i++)
|
||
|
childrenReceiver[i] = Children[i];
|
||
|
}
|
||
|
|
||
|
ForwardTree<T> IRewritable<ForwardTree<T>>.SetChildren(ReadOnlySpan<ForwardTree<T>> newChildren)
|
||
|
{
|
||
|
return new ForwardTree<T>(Node, newChildren.ToArray());
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|