1<?php
2
3/*
4 * This file is part of the Symfony package.
5 *
6 * (c) Fabien Potencier <fabien@symfony.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12namespace Symfony\Component\Finder\Iterator;
13
14/**
15 * CustomFilterIterator filters files by applying anonymous functions.
16 *
17 * The anonymous function receives a \SplFileInfo and must return false
18 * to remove files.
19 *
20 * @author Fabien Potencier <fabien@symfony.com>
21 *
22 * @extends \FilterIterator<string, \SplFileInfo>
23 */
24class CustomFilterIterator extends \FilterIterator
25{
26    private $filters = [];
27
28    /**
29     * @param \Iterator<string, \SplFileInfo> $iterator The Iterator to filter
30     * @param callable[]                      $filters  An array of PHP callbacks
31     *
32     * @throws \InvalidArgumentException
33     */
34    public function __construct(\Iterator $iterator, array $filters)
35    {
36        foreach ($filters as $filter) {
37            if (!\is_callable($filter)) {
38                throw new \InvalidArgumentException('Invalid PHP callback.');
39            }
40        }
41        $this->filters = $filters;
42
43        parent::__construct($iterator);
44    }
45
46    /**
47     * Filters the iterator values.
48     *
49     * @return bool
50     */
51    #[\ReturnTypeWillChange]
52    public function accept()
53    {
54        $fileinfo = $this->current();
55
56        foreach ($this->filters as $filter) {
57            if (false === $filter($fileinfo)) {
58                return false;
59            }
60        }
61
62        return true;
63    }
64}
65