diff --git a/docs/component/vec.md b/docs/component/vec.md index 685d86bf7..d545e7534 100644 --- a/docs/component/vec.md +++ b/docs/component/vec.md @@ -17,13 +17,13 @@ - [concat](./../../src/Psl/Vec/concat.php#L17) - [enumerate](./../../src/Psl/Vec/enumerate.php#L17) - [fill](./../../src/Psl/Vec/fill.php#L24) -- [filter](./../../src/Psl/Vec/filter.php#L30) -- [filter_keys](./../../src/Psl/Vec/filter_keys.php#L31) +- [filter](./../../src/Psl/Vec/filter.php#L34) +- [filter_keys](./../../src/Psl/Vec/filter_keys.php#L37) - [filter_nulls](./../../src/Psl/Vec/filter_nulls.php#L20) -- [filter_with_key](./../../src/Psl/Vec/filter_with_key.php#L34) +- [filter_with_key](./../../src/Psl/Vec/filter_with_key.php#L40) - [flat_map](./../../src/Psl/Vec/flat_map.php#L16) - [keys](./../../src/Psl/Vec/keys.php#L20) -- [map](./../../src/Psl/Vec/map.php#L27) +- [map](./../../src/Psl/Vec/map.php#L31) - [map_with_key](./../../src/Psl/Vec/map_with_key.php#L27) - [partition](./../../src/Psl/Vec/partition.php#L18) - [range](./../../src/Psl/Vec/range.php#L50) diff --git a/src/Psl/Dict/filter.php b/src/Psl/Dict/filter.php index 138be908a..a5696e771 100644 --- a/src/Psl/Dict/filter.php +++ b/src/Psl/Dict/filter.php @@ -37,7 +37,13 @@ function filter(iterable $iterable, ?callable $predicate = null): array $predicate = $predicate ?? Closure::fromCallable('Psl\Internal\boolean'); if (is_array($iterable)) { - return array_filter($iterable, $predicate); + return array_filter( + $iterable, + /** + * @param Tv $v + */ + static fn($v): bool => $predicate($v) + ); } $result = []; diff --git a/src/Psl/Dict/filter_keys.php b/src/Psl/Dict/filter_keys.php index cb10ef17b..1e15e9d1e 100644 --- a/src/Psl/Dict/filter_keys.php +++ b/src/Psl/Dict/filter_keys.php @@ -39,7 +39,14 @@ function filter_keys(iterable $iterable, ?callable $predicate = null): array $predicate = $predicate ?? Closure::fromCallable('Psl\Internal\boolean'); if (is_array($iterable)) { - return array_filter($iterable, $predicate, ARRAY_FILTER_USE_KEY); + return array_filter( + $iterable, + /** + * @param Tk $k + */ + static fn($k): bool => $predicate($k), + ARRAY_FILTER_USE_KEY + ); } $result = []; diff --git a/src/Psl/Iter/contains_key.php b/src/Psl/Iter/contains_key.php index 35376d905..ae29cdc98 100644 --- a/src/Psl/Iter/contains_key.php +++ b/src/Psl/Iter/contains_key.php @@ -10,7 +10,7 @@ * @template Tk * @template Tv * - * @param iterable $iterable, + * @param iterable $iterable * @param Tk $key */ function contains_key(iterable $iterable, $key): bool diff --git a/src/Psl/Vec/filter.php b/src/Psl/Vec/filter.php index 226bd797e..2960fc62d 100644 --- a/src/Psl/Vec/filter.php +++ b/src/Psl/Vec/filter.php @@ -6,6 +6,10 @@ use Closure; +use function array_filter; +use function array_values; +use function is_array; + /** * Returns a vec containing only the values for which the given predicate * returns `true`. @@ -31,6 +35,16 @@ function filter(iterable $iterable, ?callable $predicate = null): array { /** @var (callable(T): bool) $predicate */ $predicate = $predicate ?? Closure::fromCallable('Psl\Internal\boolean'); + if (is_array($iterable)) { + return array_values(array_filter( + $iterable, + /** + * @param T $t + */ + static fn($t): bool => $predicate($t) + )); + } + $result = []; foreach ($iterable as $v) { if ($predicate($v)) { diff --git a/src/Psl/Vec/filter_keys.php b/src/Psl/Vec/filter_keys.php index aebf5ae72..54b4ba745 100644 --- a/src/Psl/Vec/filter_keys.php +++ b/src/Psl/Vec/filter_keys.php @@ -6,6 +6,12 @@ use Closure; +use function array_filter; +use function array_values; +use function is_array; + +use const ARRAY_FILTER_USE_KEY; + /** * Returns a vec containing only the values for which the given predicate * returns `true`. @@ -32,6 +38,17 @@ function filter_keys(iterable $iterable, ?callable $predicate = null): array { /** @var (callable(Tk): bool) $predicate */ $predicate = $predicate ?? Closure::fromCallable('Psl\Internal\boolean'); + if (is_array($iterable)) { + return array_values(array_filter( + $iterable, + /** + * @param Tk $t + */ + static fn($t): bool => $predicate($t), + ARRAY_FILTER_USE_KEY + )); + } + $result = []; foreach ($iterable as $k => $v) { if ($predicate($k)) { diff --git a/src/Psl/Vec/filter_nulls.php b/src/Psl/Vec/filter_nulls.php index 5fc8aa169..fd0cc4c65 100644 --- a/src/Psl/Vec/filter_nulls.php +++ b/src/Psl/Vec/filter_nulls.php @@ -19,13 +19,12 @@ */ function filter_nulls(iterable $iterable): array { - /** @var list $result */ - $result = []; - foreach ($iterable as $value) { - if (null !== $value) { - $result[] = $value; - } - } - - return $result; + /** @var list */ + return filter( + $iterable, + /** + * @param T|null $value + */ + static fn($value): bool => null !== $value + ); } diff --git a/src/Psl/Vec/filter_with_key.php b/src/Psl/Vec/filter_with_key.php index 69fcede05..fca36f5dc 100644 --- a/src/Psl/Vec/filter_with_key.php +++ b/src/Psl/Vec/filter_with_key.php @@ -6,6 +6,12 @@ use Psl; +use function array_filter; +use function array_values; +use function is_array; + +use const ARRAY_FILTER_USE_BOTH; + /** * Returns a vec containing only the values for which the given predicate * returns `true`. @@ -40,6 +46,18 @@ function filter_with_key(iterable $iterable, ?callable $predicate = null): array */ static fn ($_k, $v): bool => Psl\Internal\boolean($v); + if (is_array($iterable)) { + return array_values(array_filter( + $iterable, + /** + * @param Tv $v + * @param Tk $k + */ + static fn($v, $k): bool => $predicate($k, $v), + ARRAY_FILTER_USE_BOTH + )); + } + $result = []; foreach ($iterable as $k => $v) { if ($predicate($k, $v)) { diff --git a/src/Psl/Vec/map.php b/src/Psl/Vec/map.php index 7c42d6b7c..6e41a1b28 100644 --- a/src/Psl/Vec/map.php +++ b/src/Psl/Vec/map.php @@ -4,6 +4,10 @@ namespace Psl\Vec; +use function array_map; +use function array_values; +use function is_array; + /** * Applies a mapping function to all values of an iterable. * @@ -26,6 +30,16 @@ */ function map(iterable $iterable, callable $function): array { + if (is_array($iterable)) { + return array_values(array_map( + /** + * @param Tv $v + */ + static fn($v) => $function($v), + $iterable + )); + } + $result = []; foreach ($iterable as $value) { $result[] = $function($value);