Skip to content

Commit e6520ad

Browse files
feat(filter): filters out falsy values without callable
1 parent 4732d47 commit e6520ad

File tree

4 files changed

+22
-5
lines changed

4 files changed

+22
-5
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ Full documentation with signatures and examples: **[docs/API.md](docs/API.md)**
6565
Lazy (Generator-based) unless noted as blocking.
6666

6767
- [`map`](docs/API.md#map) — Apply a callback to each element
68-
- [`filter`](docs/API.md#filter) — Keep elements matching a predicate
68+
- [`filter`](docs/API.md#filter) — Keep elements matching a predicate (without callback: remove falsy values)
6969
- [`flatMap`](docs/API.md#flatmap) — Map then flatten one level
7070
- [`flatten`](docs/API.md#flatten) — Flatten one level of nested iterables
7171
- [`take`](docs/API.md#take) — Take the first N elements

docs/API.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,18 @@ Applies `$fn` to each element. Receives `($value, $key)`. Preserves keys.
3737
### `filter`
3838

3939
```php
40-
filter(callable $fn): Closure
40+
filter(?callable $fn = null): Closure
4141
```
4242

4343
Keeps elements where `$fn` returns `true`. Receives `($value, $key)`.
44+
Without callback, removes falsy values (`null`, `false`, `0`, `""`, `[]`) — like `array_filter()`.
4445

4546
```php
4647
[1, 2, 3, 4, 5] |> filter(fn(int $n) => $n > 3) |> toArray();
4748
// [4, 5]
49+
50+
[1, 0, null, '', false, 2] |> filter() |> toArray();
51+
// [1, 2]
4852
```
4953

5054
### `flatMap`

src/Transformations/filter.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,15 @@
99

1010
/**
1111
* Keeps only elements that satisfy the predicate.
12+
* Without argument, filters out falsy values (like array_filter).
1213
*
13-
* @param callable(mixed, mixed=): bool $fn ($value, $key)
14+
* @param callable(mixed, mixed=): bool|null $fn ($value, $key)
1415
*/
15-
function filter(callable $fn): Closure
16+
function filter(?callable $fn = null): Closure
1617
{
1718
return static function (iterable $items) use ($fn): Generator {
1819
foreach ($items as $key => $value) {
19-
if ($fn($value, $key)) {
20+
if ($fn ? $fn($value, $key) : $value) {
2021
yield $value;
2122
}
2223
}

tests/FilterTest.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,18 @@ public function testReturnsEmptyForNoMatch(): void
3232
self::assertSame([], filter(fn(int $n) => $n > 100)([1, 2, 3]) |> toArray());
3333
}
3434

35+
public function testWithoutCallbackFiltersFalsyValues(): void
36+
{
37+
$result = [1, 0, null, 'hello', '', false, 2, [], true] |> filter() |> toArray();
38+
39+
self::assertSame([1, 'hello', 2, true], $result);
40+
}
41+
42+
public function testWithoutCallbackOnEmptyArray(): void
43+
{
44+
self::assertSame([], [] |> filter() |> toArray());
45+
}
46+
3547
public function testIsLazy(): void
3648
{
3749
$evaluated = 0;

0 commit comments

Comments
 (0)