Skip to content

Commit e2876d2

Browse files
committed
feat(asyncMapKeyByOnce): add asyncMapKeyByOnce function
1 parent 60d405e commit e2876d2

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

index.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import {
3030
asyncKeyFirstByOnce,
3131
asyncKeyLastByOnce,
3232
asyncLastOnce,
33+
asyncMapKeyByOnce,
3334
asyncMapOnce,
3435
asyncMaximumByOnce,
3536
asyncMaximumOnce,
@@ -671,3 +672,13 @@ test("asyncKeyLastByOnce", async t => {
671672
["even", 6]
672673
]);
673674
});
675+
676+
test("asyncMapKeyByOnce", async t => {
677+
const map = await asyncMapKeyByOnce(asyncIterator([1, 3, 4, 2, 5, 6]), e => [
678+
e % 2 === 0 ? "even" : "odd",
679+
String(e)
680+
]);
681+
t.deepEqual(map.get("even"), ["4", "2", "6"]);
682+
t.deepEqual(map.get("odd"), ["1", "3", "5"]);
683+
t.deepEqual(Array.from(map.keys()), ["odd", "even"]);
684+
});

index.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,3 +1271,33 @@ export function asyncKeyLastByOnceFn<TKey, TElement>(
12711271
): (iterator: AsyncIteratorLike<TElement>) => Promise<Map<TKey, TElement>> {
12721272
return async iterator => asyncKeyLastByOnce(iterator, f);
12731273
}
1274+
1275+
export async function asyncMapKeyByOnce<TKey, TElement, TNewElement>(
1276+
iterator: AsyncIteratorLike<TElement>,
1277+
f: (
1278+
element: TElement,
1279+
index: number
1280+
) => readonly [TKey, TNewElement] | Promise<readonly [TKey, TNewElement]>
1281+
): Promise<Map<TKey, readonly TNewElement[]>> {
1282+
const it = asyncIterator(iterator);
1283+
const map = new Map<TKey, readonly TNewElement[]>();
1284+
for (
1285+
let i = 0, element = await it.next();
1286+
element.done !== true;
1287+
++i, element = await it.next()
1288+
) {
1289+
const [key, value] = await f(element.value, i);
1290+
const entries = map.get(key) ?? [];
1291+
map.set(key, [...entries, value]);
1292+
}
1293+
return map;
1294+
}
1295+
1296+
export function asyncMapKeyByOnceFn<TKey, TElement, TNewElement>(
1297+
f: (
1298+
element: TElement,
1299+
index: number
1300+
) => readonly [TKey, TNewElement] | Promise<readonly [TKey, TNewElement]>
1301+
): (iterator: AsyncIteratorLike<TElement>) => Promise<Map<TKey, readonly TNewElement[]>> {
1302+
return async iterator => asyncMapKeyByOnce(iterator, f);
1303+
}

0 commit comments

Comments
 (0)