Skip to content

Commit 1aec907

Browse files
committed
feat(keyFirstBy): add keyFirstBy function
1 parent 06ff5c9 commit 1aec907

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

index.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
indexOf,
2626
initial,
2727
keyBy,
28+
keyFirstBy,
2829
keyLastBy,
2930
last,
3031
map,
@@ -395,6 +396,16 @@ test("keyBy", async t => {
395396
]);
396397
});
397398

399+
test("keyFirstBy", async t => {
400+
const map = await keyFirstBy(asyncIterable([1, 3, 4, 2, 5, 6]), e =>
401+
e % 2 === 0 ? "even" : "odd"
402+
);
403+
t.deepEqual(Array.from(map.entries()), [
404+
["odd", 1],
405+
["even", 4]
406+
]);
407+
});
408+
398409
test("keyLastBy", async t => {
399410
const map = await keyLastBy(asyncIterable([1, 3, 4, 2, 5, 6]), e =>
400411
e % 2 === 0 ? "even" : "odd"

index.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,6 +1042,31 @@ export function keyByFn<TKey, TElement>(
10421042

10431043
export const asyncKeyByFn = keyByFn;
10441044

1045+
export async function keyFirstBy<TKey, TElement>(
1046+
iterable: AsyncIterableLike<TElement>,
1047+
f: (element: TElement, index: number) => TKey
1048+
): Promise<Map<TKey, TElement>> {
1049+
const map = new Map<TKey, TElement>();
1050+
let i = 0;
1051+
for await (const element of await iterable) {
1052+
const key = f(element, i++);
1053+
if (!map.has(key)) {
1054+
map.set(key, element);
1055+
}
1056+
}
1057+
return map;
1058+
}
1059+
1060+
export const asyncKeyFirstBy = keyFirstBy;
1061+
1062+
export function keyFirstByFn<TKey, TElement>(
1063+
f: (element: TElement, index: number) => TKey
1064+
): (iterable: AsyncIterableLike<TElement>) => Promise<Map<TKey, TElement>> {
1065+
return async iterable => keyFirstBy(iterable, f);
1066+
}
1067+
1068+
export const asyncKeyFirstByFn = keyFirstByFn;
1069+
10451070
export async function keyLastBy<TKey, TElement>(
10461071
iterable: AsyncIterableLike<TElement>,
10471072
f: (element: TElement, index: number) => TKey

0 commit comments

Comments
 (0)