File tree 2 files changed +42
-3
lines changed
spec/drupol/phptree/Visitor
2 files changed +42
-3
lines changed Original file line number Diff line number Diff line change @@ -45,4 +45,39 @@ public function it_can_traverse_a_tree()
45
45
->traverse ($ tree )
46
46
->shouldYield (new \ArrayIterator ($ rootAndNodes ));
47
47
}
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
+ }
48
83
}
Original file line number Diff line number Diff line change @@ -14,18 +14,22 @@ class BreadthFirstVisitor extends AbstractVisitor
14
14
/**
15
15
* {@inheritdoc}
16
16
*/
17
- public function traverse (NodeInterface $ node ): \Traversable
17
+ public function traverse (NodeInterface $ node, int $ level = null ): \Traversable
18
18
{
19
19
$ queue = new \SplQueue ();
20
20
$ queue ->enqueue ($ node );
21
21
22
- yield $ node ;
22
+ if (null === $ level || $ level === $ node ->depth ()) {
23
+ yield $ node ;
24
+ }
23
25
24
26
while ($ queue ->count () > 0 ) {
25
27
foreach ($ queue ->dequeue ()->children () as $ child ) {
26
28
$ queue ->enqueue ($ child );
27
29
28
- yield $ child ;
30
+ if (null === $ level || $ level === $ child ->depth ()) {
31
+ yield $ child ;
32
+ }
29
33
}
30
34
}
31
35
}
You can’t perform that action at this time.
0 commit comments