Issues (11)

src/IterableObject.php (5 issues)

1
<?php
2
3
declare(strict_types=1);
4
5
namespace BenTools\IterableFunctions;
6
7
use CallbackFilterIterator;
8
use IteratorAggregate;
9
use IteratorIterator;
10
use Traversable;
11
12
use function array_filter;
13
use function array_map;
14
use function iterator_to_array;
15
16
/**
17
 * @internal
18
 *
19
 * @template TKey
20
 * @template TValue
21
 *
22
 * @implements IteratorAggregate<TKey, TValue>
23
 */
24
final class IterableObject implements IteratorAggregate
25
{
26
    /** @var iterable<TKey, TValue> */
27
    private $iterable;
28
29
    /** @param iterable<TKey, TValue> $iterable */
30
    public function __construct(iterable $iterable)
31
    {
32
        $this->iterable = $iterable;
33
    }
34
35
    /**
36
     * @param (callable(TValue):bool)|null $filter
0 ignored issues
show
Documentation Bug introduced by
The doc comment (callable(TValue):bool)|null at position 1 could not be parsed: Expected ')' at position 1, but found 'callable'.
Loading history...
37
     *
38
     * @return self<TKey, TValue>
39
     */
40
    public function filter(?callable $filter = null): self
41
    {
42
        if ($this->iterable instanceof Traversable) {
43
            $filter ??=
44
                /** @param mixed $value */
45
                static function ($value): bool {
46
                    return (bool) $value;
47
                };
48
49
            return new self(new CallbackFilterIterator(new IteratorIterator($this->iterable), $filter));
50
        }
51
52
        $filtered = $filter === null ? array_filter($this->iterable) : array_filter($this->iterable, $filter);
0 ignored issues
show
$this->iterable of type iterable is incompatible with the type array expected by parameter $array of array_filter(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

52
        $filtered = $filter === null ? array_filter(/** @scrutinizer ignore-type */ $this->iterable) : array_filter($this->iterable, $filter);
Loading history...
53
54
        return new self($filtered);
55
    }
56
57
    /**
58
     * @param callable(TValue):TResult $mapper
59
     *
60
     * @return self<TKey, TResult>
61
     *
62
     * @template TResult
63
     */
64
    public function map(callable $mapper): self
65
    {
66
        if ($this->iterable instanceof Traversable) {
67
            return new self(new MappedTraversable($this->iterable, $mapper));
68
        }
69
70
        return new self(array_map($mapper, $this->iterable));
0 ignored issues
show
$this->iterable of type iterable is incompatible with the type array expected by parameter $array of array_map(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

70
        return new self(array_map($mapper, /** @scrutinizer ignore-type */ $this->iterable));
Loading history...
71
    }
72
73
    /**
74
     * @return self<int, TValue>
75
     */
76
    public function values(): self
77
    {
78
        return new self(new WithoutKeysTraversable($this->iterable));
79
    }
80
81
    /** @return Traversable<TKey, TValue> */
82
    public function getIterator(): Traversable
83
    {
84
        yield from $this->iterable;
85
    }
86
87
    /** @return array<array-key, TValue> */
0 ignored issues
show
Documentation Bug introduced by
The doc comment array<array-key, TValue> at position 2 could not be parsed: Unknown type name 'array-key' at position 2 in array<array-key, TValue>.
Loading history...
88
    public function asArray(): array
89
    {
90
        return $this->iterable instanceof Traversable ? iterator_to_array($this->iterable) : $this->iterable;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->iterable i...able) : $this->iterable could return the type iterable which is incompatible with the type-hinted return array. Consider adding an additional type-check to rule them out.
Loading history...
91
    }
92
}
93