Skip to content

Commit d5f140f

Browse files
committed
Let Modifiers use a customizable traverser.
1 parent 6c214fb commit d5f140f

File tree

4 files changed

+62
-12
lines changed

4 files changed

+62
-12
lines changed

src/Modifier/Apply.php

+12-4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
namespace loophp\phptree\Modifier;
66

77
use loophp\phptree\Node\NodeInterface;
8+
use loophp\phptree\Traverser\PostOrder;
9+
use loophp\phptree\Traverser\TraverserInterface;
810

911
/**
1012
* Class Apply.
@@ -17,22 +19,28 @@ class Apply implements ModifierInterface
1719
private $apply;
1820

1921
/**
20-
* Filter constructor.
22+
* @var \loophp\phptree\Traverser\TraverserInterface|null
23+
*/
24+
private $traverser;
25+
26+
/**
27+
* Apply constructor.
2128
*
2229
* @param callable $apply
30+
* @param \loophp\phptree\Traverser\TraverserInterface|null $traverser
2331
*/
24-
public function __construct(callable $apply)
32+
public function __construct(callable $apply, ?TraverserInterface $traverser = null)
2533
{
2634
$this->apply = $apply;
35+
$this->traverser = $traverser ?? new PostOrder();
2736
}
2837

2938
/**
3039
* {@inheritdoc}
3140
*/
3241
public function modify(NodeInterface $tree): NodeInterface
3342
{
34-
/** @var \loophp\phptree\Node\MerkleNode $item */
35-
foreach ($tree->all() as $item) {
43+
foreach ($this->traverser->traverse($tree) as $item) {
3644
($this->apply)($item);
3745
}
3846

src/Modifier/Filter.php

+11-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
namespace loophp\phptree\Modifier;
66

77
use loophp\phptree\Node\NodeInterface;
8+
use loophp\phptree\Traverser\PostOrder;
9+
use loophp\phptree\Traverser\TraverserInterface;
810

911
/**
1012
* Class Filter.
@@ -16,23 +18,29 @@ class Filter implements ModifierInterface
1618
*/
1719
private $filter;
1820

21+
/**
22+
* @var \loophp\phptree\Traverser\PreOrder|\loophp\phptree\Traverser\TraverserInterface
23+
*/
24+
private $traverser;
25+
1926
/**
2027
* Filter constructor.
2128
*
2229
* @param callable $filter
30+
* @param \loophp\phptree\Traverser\TraverserInterface|null $traverser
2331
*/
24-
public function __construct(callable $filter)
32+
public function __construct(callable $filter, ?TraverserInterface $traverser = null)
2533
{
2634
$this->filter = $filter;
35+
$this->traverser = $traverser ?? new PostOrder();
2736
}
2837

2938
/**
3039
* {@inheritdoc}
3140
*/
3241
public function modify(NodeInterface $tree): NodeInterface
3342
{
34-
/** @var \loophp\phptree\Node\MerkleNode $item */
35-
foreach ($tree->all() as $item) {
43+
foreach ($this->traverser->traverse($tree) as $item) {
3644
if (null === $parent = $item->getParent()) {
3745
continue;
3846
}

src/Modifier/FulfillCapacity.php

+19-2
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,36 @@
55
namespace loophp\phptree\Modifier;
66

77
use loophp\phptree\Node\NodeInterface;
8+
use loophp\phptree\Traverser\PostOrder;
9+
use loophp\phptree\Traverser\TraverserInterface;
810

911
/**
1012
* Class FulfillCapacity.
1113
*/
1214
class FulfillCapacity implements ModifierInterface
1315
{
16+
/**
17+
* @var \loophp\phptree\Traverser\PreOrder|\loophp\phptree\Traverser\TraverserInterface
18+
*/
19+
private $traverser;
20+
21+
/**
22+
* FulfillCapacity constructor.
23+
*
24+
* @param \loophp\phptree\Traverser\TraverserInterface|null $traverser
25+
*/
26+
public function __construct(?TraverserInterface $traverser = null)
27+
{
28+
$this->traverser = $traverser ?? new PostOrder();
29+
}
30+
1431
/**
1532
* {@inheritdoc}
1633
*/
1734
public function modify(NodeInterface $tree): NodeInterface
1835
{
19-
/** @var \loophp\phptree\Node\MerkleNode $item */
20-
foreach ($tree->all() as $item) {
36+
/** @var \loophp\phptree\Node\NaryNodeInterface $item */
37+
foreach ($this->traverser->traverse($tree) as $item) {
2138
$capacity = $item->capacity();
2239

2340
if (false === $item->isLeaf()) {

src/Modifier/RemoveNullNode.php

+20-3
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,41 @@
55
namespace loophp\phptree\Modifier;
66

77
use loophp\phptree\Node\NodeInterface;
8+
use loophp\phptree\Traverser\PostOrder;
9+
use loophp\phptree\Traverser\TraverserInterface;
810

911
/**
1012
* Class RemoveNullNode.
1113
*/
1214
class RemoveNullNode implements ModifierInterface
1315
{
16+
/**
17+
* @var \loophp\phptree\Traverser\PreOrder|\loophp\phptree\Traverser\TraverserInterface
18+
*/
19+
private $traverser;
20+
21+
/**
22+
* RemoveNullNode constructor.
23+
*
24+
* @param \loophp\phptree\Traverser\TraverserInterface|null $traverser
25+
*/
26+
public function __construct(?TraverserInterface $traverser = null)
27+
{
28+
$this->traverser = $traverser ?? new PostOrder();
29+
}
30+
1431
/**
1532
* {@inheritdoc}
1633
*/
1734
public function modify(NodeInterface $tree): NodeInterface
1835
{
19-
/** @var \loophp\phptree\Node\MerkleNode $item */
20-
foreach ($tree->all() as $item) {
36+
/** @var \loophp\phptree\Node\ValueNodeInterface $item */
37+
foreach ($this->traverser->traverse($tree) as $item) {
2138
if (null === $parent = $item->getParent()) {
2239
continue;
2340
}
2441

25-
if (true !== $item->isLeaf()) {
42+
if (false === $item->isLeaf()) {
2643
continue;
2744
}
2845

0 commit comments

Comments
 (0)