11<?php
22
3- namespace BenTools \ IterableFunctions ;
3+ declare (strict_types= 1 ) ;
44
5+ namespace BenTools \IterableFunctions ;
56
67use ArrayIterator ;
78use CallbackFilterIterator ;
89use IteratorIterator ;
910use Traversable ;
1011
12+ use function array_filter ;
13+ use function array_map ;
14+ use function array_values ;
15+ use function iterator_to_array ;
16+
1117/**
1218 * Maps a callable to an iterable.
1319 *
14- * @param array|Traversable $iterable
15- * @return array|ArrayIterator
20+ * @param iterable<mixed> $iterable
21+ *
22+ * @return iterable<mixed>
1623 */
1724function iterable_map (iterable $ iterable , callable $ map ): iterable
1825{
@@ -23,27 +30,29 @@ function iterable_map(iterable $iterable, callable $map): iterable
2330 return array_map ($ map , $ iterable );
2431}
2532
26-
2733/**
2834 * Copy the iterable into an array. If the iterable is already an array, return it.
2935 *
30- * @param array|Traversable $iterable
31- * @param bool $use_keys [optional] Whether to use the iterator element keys as index.
32- * @return array
36+ * @param iterable<mixed> $iterable
37+ * @param bool $preserveKeys [optional] Whether to use the iterator element keys as index.
38+ *
39+ * @return array<mixed>
3340 */
34- function iterable_to_array (iterable $ iterable , bool $ use_keys = true ): array
41+ function iterable_to_array (iterable $ iterable , bool $ preserveKeys = true ): array
3542{
3643 if ($ iterable instanceof Traversable) {
37- return iterator_to_array ($ iterable , $ use_keys );
44+ return iterator_to_array ($ iterable , $ preserveKeys );
3845 }
3946
40- return $ use_keys ? $ iterable : array_values ($ iterable );
47+ return $ preserveKeys ? $ iterable : array_values ($ iterable );
4148}
4249
4350/**
44- * If the iterable is not intance of Traversable, it is an array => convert it to an ArrayIterator.
51+ * If the iterable is not instance of Traversable, it is an array => convert it to an ArrayIterator.
52+ *
53+ * @param iterable<mixed> $iterable
4554 *
46- * @param array| Traversable $iterable
55+ * @return Traversable<mixed>
4756 */
4857function iterable_to_traversable (iterable $ iterable ): Traversable
4958{
@@ -54,16 +63,16 @@ function iterable_to_traversable(iterable $iterable): Traversable
5463 return new ArrayIterator ($ iterable );
5564}
5665
57-
5866/**
5967 * Filters an iterable.
6068 *
61- * @param array|Traversable $iterable
62- * @return array|CallbackFilterIterator
69+ * @param iterable<mixed> $iterable
70+ *
71+ * @return array<mixed>|CallbackFilterIterator
6372 */
6473function iterable_filter (iterable $ iterable , ?callable $ filter = null )
6574{
66- if (null === $ filter ) {
75+ if ($ filter === null ) {
6776 $ filter = static function ($ value ) {
6877 return (bool ) $ value ;
6978 };
@@ -76,21 +85,19 @@ function iterable_filter(iterable $iterable, ?callable $filter = null)
7685 return array_filter ($ iterable , $ filter );
7786}
7887
79-
8088/**
8189 * Reduces an iterable.
8290 *
8391 * @param iterable<mixed> $iterable
8492 * @param callable(mixed, mixed) $reduce
93+ *
8594 * @return mixed
8695 *
8796 * @psalm-template TValue
8897 * @psalm-template TResult
89- *
9098 * @psalm-param iterable<TValue> $iterable
9199 * @psalm-param callable(TResult|null, TValue) $reduce
92100 * @psalm-param TResult|null $initial
93- *
94101 * @psalm-return TResult|null
95102 */
96103function iterable_reduce (iterable $ iterable , callable $ reduce , $ initial = null )
@@ -102,6 +109,9 @@ function iterable_reduce(iterable $iterable, callable $reduce, $initial = null)
102109 return $ initial ;
103110}
104111
112+ /**
113+ * @param iterable<mixed> $iterable
114+ */
105115function iterable (iterable $ iterable , ?callable $ filter = null , ?callable $ map = null ): IterableObject
106116{
107117 return new IterableObject ($ iterable , $ filter , $ map );
0 commit comments