Skip to content

Commit 7da8363

Browse files
authored
Feat: Allow object keys (#24)
1 parent dacc89c commit 7da8363

File tree

2 files changed

+24
-5
lines changed

2 files changed

+24
-5
lines changed

src/iterable-functions.php

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
use Traversable;
1111

1212
use function array_filter;
13-
use function array_map;
1413
use function array_values;
1514
use function iterator_to_array;
1615

@@ -23,11 +22,9 @@
2322
*/
2423
function iterable_map(iterable $iterable, callable $map): iterable
2524
{
26-
if ($iterable instanceof Traversable) {
27-
return new ArrayIterator(array_map($map, iterator_to_array($iterable)));
25+
foreach ($iterable as $key => $item) {
26+
yield $key => $map($item);
2827
}
29-
30-
return array_map($map, $iterable);
3128
}
3229

3330
/**

tests/IterableMapTest.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,17 @@
44

55
namespace BenTools\IterableFunctions\Tests;
66

7+
use Generator;
8+
use PHPUnit\Framework\Assert;
79
use SplFixedArray;
10+
use stdClass;
811

912
use function BenTools\IterableFunctions\iterable_map;
1013
use function BenTools\IterableFunctions\iterable_to_array;
1114
use function it;
1215
use function PHPUnit\Framework\assertEquals;
16+
use function PHPUnit\Framework\assertInstanceOf;
17+
use function PHPUnit\Framework\assertSame;
1318

1419
it('maps an array', function (): void {
1520
$iterable = ['foo', 'bar'];
@@ -22,3 +27,20 @@
2227
$map = 'strtoupper';
2328
assertEquals(['FOO', 'BAR'], iterable_to_array(iterable_map($iterable, $map)));
2429
});
30+
31+
it('maps iterable with object keys', function (): void {
32+
foreach (iterable_map(iterableWithObjectKeys(), 'strtoupper') as $key => $item) {
33+
assertInstanceOf(stdClass::class, $key);
34+
assertSame('FOO', $item);
35+
36+
return;
37+
}
38+
39+
Assert::fail('Did not iterate');
40+
});
41+
42+
/** @return Generator<stdClass, string> */
43+
function iterableWithObjectKeys(): Generator
44+
{
45+
yield new stdClass() => 'foo';
46+
}

0 commit comments

Comments
 (0)