Files
rspade_system/vendor/nicmart/tree/src/Node/NodeTrait.php
root f6fac6c4bc Fix bin/publish: copy docs.dist from project root
Fix bin/publish: use correct .env path for rspade_system
Fix bin/publish script: prevent grep exit code 1 from terminating script

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-21 02:08:33 +00:00

215 lines
4.2 KiB
PHP
Executable File

<?php
/**
* Copyright (c) 2013-2024 Nicolò Martini
*
* For the full copyright and license information, please view
* the LICENSE.md file that was distributed with this source code.
*
* @see https://github.com/nicmart/Tree
*/
namespace Tree\Node;
use Tree\Visitor\Visitor;
trait NodeTrait
{
private mixed $value = null;
private ?NodeInterface $parent = null;
/**
* @var array<int, NodeInterface>
*/
private array $children = [];
public function setValue(mixed $value): static
{
$this->value = $value;
return $this;
}
public function getValue(): mixed
{
return $this->value;
}
public function addChild(NodeInterface $child): static
{
$child->setParent($this);
$this->children[] = $child;
return $this;
}
public function removeChild(NodeInterface $child): static
{
foreach ($this->children as $key => $myChild) {
if ($child === $myChild) {
unset($this->children[$key]);
}
}
$this->children = \array_values($this->children);
$child->setParent(null);
return $this;
}
public function removeAllChildren(): static
{
$this->setChildren([]);
return $this;
}
public function getChildren(): array
{
return $this->children;
}
public function setChildren(array $children): static
{
foreach ($this->getChildren() as $child) {
$child->setParent(null);
}
$this->children = [];
foreach ($children as $child) {
$this->addChild($child);
}
return $this;
}
public function setParent(?NodeInterface $parent = null): void
{
$this->parent = $parent;
}
public function getParent(): ?static
{
return $this->parent;
}
public function getAncestors(): array
{
$parents = [];
$node = $this;
while (($parent = $node->getParent()) instanceof NodeInterface) {
\array_unshift($parents, $parent);
$node = $parent;
}
return $parents;
}
public function getAncestorsAndSelf(): array
{
return \array_merge($this->getAncestors(), [$this]);
}
public function getNeighbors(): array
{
if (null === $this->parent) {
return [];
}
$neighbors = $this->parent->getChildren();
$that = $this;
return \array_values(\array_filter($neighbors, static function (NodeInterface $node) use ($that): bool {
return $node !== $that;
}));
}
public function getNeighborsAndSelf(): array
{
if (null === $this->parent) {
return [
$this,
];
}
return $this->parent->getChildren();
}
public function isRoot(): bool
{
return null === $this->parent;
}
public function isChild(): bool
{
return null !== $this->parent;
}
public function isLeaf(): bool
{
return [] === $this->children;
}
public function root(): static
{
$node = $this;
while (($parent = $node->getParent()) instanceof NodeInterface) {
$node = $parent;
}
return $node;
}
/**
* Return the distance from the current node to the root.
*
* Warning, can be expensive, since each descendant is visited
*/
public function getDepth(): int
{
if ($this->isRoot()) {
return 0;
}
return $this->getParent()->getDepth() + 1;
}
/**
* Return the height of the tree whose root is this node.
*/
public function getHeight(): int
{
if ($this->isLeaf()) {
return 0;
}
$heights = [];
foreach ($this->getChildren() as $child) {
$heights[] = $child->getHeight();
}
return \max($heights) + 1;
}
public function getSize(): int
{
$size = 1;
foreach ($this->getChildren() as $child) {
$size += $child->getSize();
}
return $size;
}
public function accept(Visitor $visitor): mixed
{
return $visitor->visit($this);
}
}