using InnovEnergy.Lib.Utils; using Sawmill; namespace InnovEnergy.Lib.SrcGen.Trees; public class ForwardTree : IRewritable> where T : notnull { public T Node { get; } public IReadOnlyList> Children { get; } public Boolean IsLeaf => Children.Count == 0; public ForwardTree(T node) : this(node, Array.Empty>()) { } public ForwardTree(T node, IReadOnlyList> children) { Node = node; Children = children; } public ForwardTree WithNode(T node) => new ForwardTree(node, Children); public ForwardTree WithNode(Func makeNode) => new ForwardTree(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>.CountChildren() => Children.Count; void IRewritable>.GetChildren(Span> childrenReceiver) { for (var i = 0; i < Children.Count; i++) childrenReceiver[i] = Children[i]; } ForwardTree IRewritable>.SetChildren(ReadOnlySpan> newChildren) { return new ForwardTree(Node, newChildren.ToArray()); } }