44
55namespace BenTools \IterableFunctions ;
66
7- use EmptyIterator ;
7+ use CallbackFilterIterator ;
88use IteratorAggregate ;
9+ use IteratorIterator ;
910use Traversable ;
1011
12+ use function array_filter ;
13+ use function array_map ;
14+ use function iterator_to_array ;
15+
1116/**
1217 * @internal
1318 *
@@ -18,73 +23,51 @@ final class IterableObject implements IteratorAggregate
1823 /** @var iterable<mixed> */
1924 private $ iterable ;
2025
21- /** @var callable|null */
22- private $ filterFn ;
23-
24- /** @var callable|null */
25- private $ mapFn ;
26-
27- /**
28- * @param iterable<mixed>|null $iterable
29- */
30- private function __construct (?iterable $ iterable = null , ?callable $ filter = null , ?callable $ map = null )
31- {
32- $ this ->iterable = $ iterable ?? new EmptyIterator ();
33- $ this ->filterFn = $ filter ;
34- $ this ->mapFn = $ map ;
35- }
36-
3726 /**
38- * @param iterable<mixed>|null $iterable
27+ * @param iterable<mixed> $iterable
3928 */
40- public static function new (? iterable $ iterable = null ): self
29+ public function __construct ( iterable $ iterable)
4130 {
42- return new self ( $ iterable) ;
31+ $ this -> iterable = $ iterable ;
4332 }
4433
4534 public function filter (?callable $ filter = null ): self
4635 {
47- $ filter = $ filter ?? function ($ value ): bool {
48- return (bool ) $ value ;
49- };
36+ if ($ this ->iterable instanceof Traversable) {
37+ $ filter = $ filter ??
38+ /** @param mixed $value */
39+ static function ($ value ): bool {
40+ return (bool ) $ value ;
41+ };
42+
43+ return new self (new CallbackFilterIterator (new IteratorIterator ($ this ->iterable ), $ filter ));
44+ }
45+
46+ $ filtered = $ filter === null ? array_filter ($ this ->iterable ) : array_filter ($ this ->iterable , $ filter );
5047
51- return new self ($ this -> iterable , $ filter , $ this -> mapFn );
48+ return new self ($ filtered );
5249 }
5350
54- public function map (callable $ map ): self
51+ public function map (callable $ mapper ): self
5552 {
56- return new self ($ this ->iterable , $ this ->filterFn , $ map );
53+ if ($ this ->iterable instanceof Traversable) {
54+ return new self (new MappedTraversable ($ this ->iterable , $ mapper ));
55+ }
56+
57+ return new self (array_map ($ mapper , $ this ->iterable ));
5758 }
5859
5960 /**
6061 * @return Traversable<mixed>
6162 */
6263 public function getIterator (): Traversable
6364 {
64- $ iterable = $ this ->iterable ;
65- if ($ this ->filterFn !== null ) {
66- $ iterable = iterable_filter ($ iterable , $ this ->filterFn );
67- }
68-
69- if ($ this ->mapFn !== null ) {
70- $ iterable = iterable_map ($ iterable , $ this ->mapFn );
71- }
72-
73- return iterable_to_traversable ($ iterable );
65+ yield from $ this ->iterable ;
7466 }
7567
7668 /** @return array<mixed> */
7769 public function asArray (): array
7870 {
79- $ iterable = $ this ->iterable ;
80- if ($ this ->filterFn !== null ) {
81- $ iterable = iterable_filter ($ iterable , $ this ->filterFn );
82- }
83-
84- if ($ this ->mapFn !== null ) {
85- $ iterable = iterable_map ($ iterable , $ this ->mapFn );
86- }
87-
88- return iterable_to_array ($ iterable );
71+ return $ this ->iterable instanceof Traversable ? iterator_to_array ($ this ->iterable ) : $ this ->iterable ;
8972 }
9073}
0 commit comments