using InnovEnergy.Lib.Utils; using Sawmill; namespace InnovEnergy.Lib.SrcGen.Trees; public class Tree :IRewritable> where T : notnull { private readonly ForwardTree _Tree; public Tree? Parent { get; } public Boolean IsRoot => Parent is null; public Boolean IsLeaf => !Children.Any(); public Tree(ForwardTree tree, Tree? parent = default) { _Tree = tree; Parent = parent; } public T Node => _Tree.Node; public IEnumerable> Children => _Tree .Children .Select(c => new Tree(c, this)); public IEnumerable> Ancestors => Parent.Unfold(t => t.Parent); public override String ToString() => _Tree.ToString(); public Tree Root => this.Unfold(t => t.Parent).Last(); Int32 IRewritable>.CountChildren() => _Tree.Children.Count; void IRewritable>.GetChildren(Span> childrenReceiver) { var i = 0; foreach (var child in Children) childrenReceiver[i++] = child; } Tree IRewritable>.SetChildren(ReadOnlySpan> newChildren) { var forwardTree = new ForwardTree(Node, _Tree.Children.ToArray()); return new Tree(forwardTree, Parent); } }