Skip to content

Commit 06ff5c9

Browse files
committed
feat(keyBy): add keyBy function
1 parent 045cbc9 commit 06ff5c9

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

index.test.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
index,
2525
indexOf,
2626
initial,
27+
keyBy,
2728
keyLastBy,
2829
last,
2930
map,
@@ -386,6 +387,14 @@ test("zip", async t => {
386387
]);
387388
});
388389

390+
test("keyBy", async t => {
391+
const map = await keyBy(asyncIterable([1, 3, 4, 2, 5, 6]), e => (e % 2 === 0 ? "even" : "odd"));
392+
t.deepEqual(Array.from(map.entries()), [
393+
["odd", [1, 3, 5]],
394+
["even", [4, 2, 6]]
395+
]);
396+
});
397+
389398
test("keyLastBy", async t => {
390399
const map = await keyLastBy(asyncIterable([1, 3, 4, 2, 5, 6]), e =>
391400
e % 2 === 0 ? "even" : "odd"

index.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,6 +1017,31 @@ export function zipFn<T, U>(
10171017

10181018
export const asyncZipFn = zipFn;
10191019

1020+
export async function keyBy<TKey, TElement>(
1021+
iterable: AsyncIterableLike<TElement>,
1022+
f: (element: TElement, index: number) => TKey
1023+
): Promise<Map<TKey, TElement[]>> {
1024+
const map = new Map<TKey, TElement[]>();
1025+
let i = 0;
1026+
for await (const element of await iterable) {
1027+
const key = f(element, i++);
1028+
const group = map.get(key) ?? [];
1029+
group.push(element);
1030+
map.set(key, group);
1031+
}
1032+
return map;
1033+
}
1034+
1035+
export const asyncKeyBy = keyBy;
1036+
1037+
export function keyByFn<TKey, TElement>(
1038+
f: (element: TElement, index: number) => TKey
1039+
): (iterable: AsyncIterableLike<TElement>) => Promise<Map<TKey, TElement[]>> {
1040+
return async iterable => keyBy(iterable, f);
1041+
}
1042+
1043+
export const asyncKeyByFn = keyByFn;
1044+
10201045
export async function keyLastBy<TKey, TElement>(
10211046
iterable: AsyncIterableLike<TElement>,
10221047
f: (element: TElement, index: number) => TKey

0 commit comments

Comments
 (0)