Skip to content

Commit 5d342cb

Browse files
authored
feat: introduce mappedQueuesFromIterable (#30)
1 parent 06deec5 commit 5d342cb

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed

src/ds.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use Ds\Map;
88
use Ds\Pair;
9+
use Ds\Queue;
910
use Ds\Set;
1011
use Ds\Vector;
1112

@@ -53,6 +54,37 @@ function mapFromIterable(iterable $iterable, callable $mapper): Map
5354
return $map;
5455
}
5556

57+
/**
58+
* @param iterable<K, V> $iterable
59+
* @param callable(K, V): Pair<KReturn, VReturn> $mapper
60+
*
61+
* @return Map<KReturn, Queue<VReturn>>
62+
*
63+
* @template K
64+
* @template V
65+
* @template KReturn
66+
* @template VReturn
67+
*/
68+
function mappedQueuesFromIterable(iterable $iterable, callable $mapper): Map
69+
{
70+
/** @var Map<KReturn, Queue<VReturn>> $map */
71+
$map = new Map();
72+
73+
foreach ($iterable as $key => $value) {
74+
$keyValue = $mapper($key, $value);
75+
$queue = $map->get($keyValue->key, null);
76+
if ($queue === null) {
77+
/** @var Queue<VReturn> $queue */
78+
$queue = new Queue();
79+
$map->put($keyValue->key, $queue);
80+
}
81+
82+
$queue->push($keyValue->value);
83+
}
84+
85+
return $map;
86+
}
87+
5688
/**
5789
* @deprecated Use {@link mappedSetsFromIterable} instead
5890
*

tests/DsTest.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@
1111

1212
use function Cdn77\Functions\mapFromEntries;
1313
use function Cdn77\Functions\mapFromIterable;
14+
use function Cdn77\Functions\mappedQueuesFromIterable;
1415
use function Cdn77\Functions\mappedSetsFromIterable;
1516
use function Cdn77\Functions\setFromIterable;
1617
use function Cdn77\Functions\vectorFromIterable;
1718

1819
#[CoversFunction('Cdn77\Functions\mapFromIterable')]
20+
#[CoversFunction('Cdn77\Functions\mappedQueuesFromIterable')]
1921
#[CoversFunction('Cdn77\Functions\mappedSetsFromIterable')]
2022
#[CoversFunction('Cdn77\Functions\setFromIterable')]
2123
#[CoversFunction('Cdn77\Functions\vectorFromIterable')]
@@ -53,6 +55,32 @@ public function testMapFromIterable(): void
5355
self::assertFalse($map->get(4));
5456
}
5557

58+
public function testMappedQueuesFromIterable(): void
59+
{
60+
/** @var callable():Generator<int, string> $iterableFactory */
61+
$iterableFactory = static function (): Generator {
62+
yield 1 => 'a';
63+
yield 1 => 'b';
64+
yield 2 => 'c';
65+
yield 2 => 'd';
66+
};
67+
68+
$map = mappedQueuesFromIterable(
69+
$iterableFactory(),
70+
static fn (int $key, string $value) => new Pair($key * 2, $value . '_')
71+
);
72+
73+
self::assertCount(2, $map);
74+
75+
$queueAt2 = $map->get(2);
76+
self::assertSame('a_', $queueAt2->pop());
77+
self::assertSame('b_', $queueAt2->pop());
78+
79+
$queueAt4 = $map->get(4);
80+
self::assertSame('c_', $queueAt4->pop());
81+
self::assertSame('d_', $queueAt4->pop());
82+
}
83+
5684
public function testMappedSetsFromIterable(): void
5785
{
5886
/** @var callable():Generator<int, string> $iterableFactory */

0 commit comments

Comments
 (0)