diff --git a/src/iterable-functions.php b/src/iterable-functions.php index f9a698d..df51b9d 100644 --- a/src/iterable-functions.php +++ b/src/iterable-functions.php @@ -10,7 +10,6 @@ use Traversable; use function array_filter; -use function array_map; use function array_values; use function iterator_to_array; @@ -23,11 +22,9 @@ */ function iterable_map(iterable $iterable, callable $map): iterable { - if ($iterable instanceof Traversable) { - return new ArrayIterator(array_map($map, iterator_to_array($iterable))); + foreach ($iterable as $key => $item) { + yield $key => $map($item); } - - return array_map($map, $iterable); } /** diff --git a/tests/IterableMapTest.php b/tests/IterableMapTest.php index c9b7c99..86b3207 100644 --- a/tests/IterableMapTest.php +++ b/tests/IterableMapTest.php @@ -4,12 +4,17 @@ namespace BenTools\IterableFunctions\Tests; +use Generator; +use PHPUnit\Framework\Assert; use SplFixedArray; +use stdClass; use function BenTools\IterableFunctions\iterable_map; use function BenTools\IterableFunctions\iterable_to_array; use function it; use function PHPUnit\Framework\assertEquals; +use function PHPUnit\Framework\assertInstanceOf; +use function PHPUnit\Framework\assertSame; it('maps an array', function (): void { $iterable = ['foo', 'bar']; @@ -22,3 +27,20 @@ $map = 'strtoupper'; assertEquals(['FOO', 'BAR'], iterable_to_array(iterable_map($iterable, $map))); }); + +it('maps iterable with object keys', function (): void { + foreach (iterable_map(iterableWithObjectKeys(), 'strtoupper') as $key => $item) { + assertInstanceOf(stdClass::class, $key); + assertSame('FOO', $item); + + return; + } + + Assert::fail('Did not iterate'); +}); + +/** @return Generator */ +function iterableWithObjectKeys(): Generator +{ + yield new stdClass() => 'foo'; +}