Skip to content

Commit 32f5da2

Browse files
committed
feat(mapKeyBy): add mapKeyBy function
1 parent 5ebf905 commit 32f5da2

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

index.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import {
2929
keyLastBy,
3030
last,
3131
map,
32+
mapKeyBy,
3233
maximum,
3334
maximumBy,
3435
minimum,
@@ -424,3 +425,13 @@ test("keyLastBy", async t => {
424425
["even", 6]
425426
]);
426427
});
428+
429+
test("mapKeyBy", async t => {
430+
const map = await mapKeyBy(asyncIterable([1, 3, 4, 2, 5, 6]), e => [
431+
e % 2 === 0 ? "even" : "odd",
432+
String(e)
433+
]);
434+
t.deepEqual(map.get("even"), ["4", "2", "6"]);
435+
t.deepEqual(map.get("odd"), ["1", "3", "5"]);
436+
t.deepEqual(Array.from(map.keys()), ["odd", "even"]);
437+
});

index.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1123,3 +1123,34 @@ export function keyLastByFn<TKey, TElement>(
11231123
}
11241124

11251125
export const asyncKeyLastByFn = keyLastByFn;
1126+
1127+
export async function mapKeyBy<TKey, TElement, TNewElement>(
1128+
iterable: AsyncIterableLike<TElement>,
1129+
f: (
1130+
element: TElement,
1131+
index: number
1132+
) => readonly [TKey, TNewElement] | Promise<readonly [TKey, TNewElement]>
1133+
): Promise<Map<TKey, TNewElement[]>> {
1134+
const map = new Map<TKey, TNewElement[]>();
1135+
let i = 0;
1136+
for await (const element of await iterable) {
1137+
const [key, value] = await f(element, i++);
1138+
const group = map.get(key) ?? [];
1139+
group.push(value);
1140+
map.set(key, group);
1141+
}
1142+
return map;
1143+
}
1144+
1145+
export const asyncMapKeyBy = mapKeyBy;
1146+
1147+
export function mapKeyByFn<TKey, TElement, TNewElement>(
1148+
f: (
1149+
element: TElement,
1150+
index: number
1151+
) => readonly [TKey, TNewElement] | Promise<readonly [TKey, TNewElement]>
1152+
): (iterable: AsyncIterableLike<TElement>) => Promise<Map<TKey, TNewElement[]>> {
1153+
return async iterable => mapKeyBy(iterable, f);
1154+
}
1155+
1156+
export const asyncMapKeyByFn = mapKeyByFn;

0 commit comments

Comments
 (0)