Editing trees
Tree operations return cloned structures and leave their inputs unchanged.
Extract a subtree
<?php
$src = $tree->split('project/src');
if (null === $src) {
throw new RuntimeException('Subtree not found.');
}split() accepts a path relative to the current node or prefixed with its root
path. It returns null when the path does not exist.
Merge and append
<?php
use Alto\Tree\TreeBuilder;
$tests = TreeBuilder::fromPaths(['project/tests/AppTest.php'], 'project');
$merged = TreeBuilder::fromPaths(['project/src/App.php'], 'project')
->merge($tests);
$withDocs = $merged->append(
TreeBuilder::fromPaths(['docs/index.md'], 'docs'),
'documentation',
);Merge combines directory children recursively. When the same file exists in both inputs, the receiver's node wins. Append adds a cloned child and may rename its root.
Flatten and rebuild
<?php
use Alto\Tree\Traverser\TreeFlattener;
$paths = TreeFlattener::flatten($tree);
$rebuilt = TreeFlattener::buildTree($paths, 'project');Flattening includes the root and follows traversal order. Supply the root when rebuilding if automatic common-path inference would be ambiguous.