Skip to content

Commit 5c924b9

Browse files
committed
Add a new level parameter to the BreadthFirst visitor.
1 parent 8f46d3c commit 5c924b9

File tree

2 files changed

+42
-3
lines changed

2 files changed

+42
-3
lines changed

spec/drupol/phptree/Visitor/BreadthFirstVisitorSpec.php

+35
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,39 @@ public function it_can_traverse_a_tree()
4545
->traverse($tree)
4646
->shouldYield(new \ArrayIterator($rootAndNodes));
4747
}
48+
49+
public function it_can_traverse_a_tree_at_a_specific_level_only()
50+
{
51+
$tree = new Node();
52+
53+
$nodes = [];
54+
$nodes1 = [];
55+
$nodes2 = [];
56+
foreach (\range('1', '5') as $lowercaseValue) {
57+
$node1 = new Node();
58+
59+
foreach (\range('A', 'E') as $uppercaseValue) {
60+
$node2 = new Node();
61+
62+
$node1->add($node2);
63+
64+
$nodes2[] = $node2;
65+
}
66+
67+
$nodes1[] = $node1;
68+
$nodes[] = $node1;
69+
}
70+
71+
$tree->add(...$nodes);
72+
73+
$rootAndNodes = \array_merge($nodes2);
74+
75+
$this
76+
->traverse($tree, 2)
77+
->shouldYield(new \ArrayIterator($rootAndNodes));
78+
79+
$this
80+
->traverse($tree, 0)
81+
->shouldYield(new \ArrayIterator([$tree]));
82+
}
4883
}

src/Visitor/BreadthFirstVisitor.php

+7-3
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,22 @@ class BreadthFirstVisitor extends AbstractVisitor
1414
/**
1515
* {@inheritdoc}
1616
*/
17-
public function traverse(NodeInterface $node): \Traversable
17+
public function traverse(NodeInterface $node, int $level = null): \Traversable
1818
{
1919
$queue = new \SplQueue();
2020
$queue->enqueue($node);
2121

22-
yield $node;
22+
if (null === $level || $level === $node->depth()) {
23+
yield $node;
24+
}
2325

2426
while ($queue->count() > 0) {
2527
foreach ($queue->dequeue()->children() as $child) {
2628
$queue->enqueue($child);
2729

28-
yield $child;
30+
if (null === $level || $level === $child->depth()) {
31+
yield $child;
32+
}
2933
}
3034
}
3135
}

0 commit comments

Comments
 (0)