| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Console\Helper;
- /**
- * @implements \IteratorAggregate<TreeNode>
- *
- * @author Simon André <smn.andre@gmail.com>
- */
- final class TreeNode implements \Countable, \IteratorAggregate
- {
- /**
- * @var array<TreeNode|callable(): \Generator>
- */
- private array $children = [];
- public function __construct(
- private readonly string $value = '',
- iterable $children = [],
- ) {
- foreach ($children as $child) {
- $this->addChild($child);
- }
- }
- public static function fromValues(iterable $nodes, ?self $node = null): self
- {
- $node ??= new self();
- foreach ($nodes as $key => $value) {
- if (is_iterable($value)) {
- $child = new self($key);
- self::fromValues($value, $child);
- $node->addChild($child);
- } elseif ($value instanceof self) {
- $node->addChild($value);
- } else {
- $node->addChild(new self($value));
- }
- }
- return $node;
- }
- public function getValue(): string
- {
- return $this->value;
- }
- public function addChild(self|string|callable $node): self
- {
- if (\is_string($node)) {
- $node = new self($node);
- }
- $this->children[] = $node;
- return $this;
- }
- /**
- * @return \Traversable<int, TreeNode>
- */
- public function getChildren(): \Traversable
- {
- foreach ($this->children as $child) {
- if (\is_callable($child)) {
- yield from $child();
- } elseif ($child instanceof self) {
- yield $child;
- }
- }
- }
- /**
- * @return \Traversable<int, TreeNode>
- */
- public function getIterator(): \Traversable
- {
- return $this->getChildren();
- }
- public function count(): int
- {
- $count = 0;
- foreach ($this->getChildren() as $child) {
- ++$count;
- }
- return $count;
- }
- public function __toString(): string
- {
- return $this->value;
- }
- }
|