Skip to content

Commit 923e4cc

Browse files
committed
feat(mapKeyFirstBy): add mapKeyFirstBy function
1 parent 32f5da2 commit 923e4cc

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
@@ -30,6 +30,7 @@ import {
3030
last,
3131
map,
3232
mapKeyBy,
33+
mapKeyFirstBy,
3334
maximum,
3435
maximumBy,
3536
minimum,
@@ -435,3 +436,13 @@ test("mapKeyBy", async t => {
435436
t.deepEqual(map.get("odd"), ["1", "3", "5"]);
436437
t.deepEqual(Array.from(map.keys()), ["odd", "even"]);
437438
});
439+
440+
test("mapKeyFirstBy", async t => {
441+
const map = await mapKeyFirstBy(asyncIterable([1, 3, 4, 2, 5, 6]), e => [
442+
e % 2 === 0 ? "even" : "odd",
443+
String(e)
444+
]);
445+
t.is(map.get("even"), "4");
446+
t.is(map.get("odd"), "1");
447+
t.deepEqual(Array.from(map.keys()), ["odd", "even"]);
448+
});

index.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1154,3 +1154,34 @@ export function mapKeyByFn<TKey, TElement, TNewElement>(
11541154
}
11551155

11561156
export const asyncMapKeyByFn = mapKeyByFn;
1157+
1158+
export async function mapKeyFirstBy<TKey, TElement, TNewElement>(
1159+
iterable: AsyncIterableLike<TElement>,
1160+
f: (
1161+
element: TElement,
1162+
index: number
1163+
) => readonly [TKey, TNewElement] | Promise<readonly [TKey, TNewElement]>
1164+
): Promise<Map<TKey, TNewElement>> {
1165+
const map = new Map<TKey, TNewElement>();
1166+
let i = 0;
1167+
for await (const element of await iterable) {
1168+
const [key, value] = await f(element, i++);
1169+
if (!map.has(key)) {
1170+
map.set(key, value);
1171+
}
1172+
}
1173+
return map;
1174+
}
1175+
1176+
export const asyncMapKeyFirstBy = mapKeyFirstBy;
1177+
1178+
export function mapKeyFirstByFn<TKey, TElement, TNewElement>(
1179+
f: (
1180+
element: TElement,
1181+
index: number
1182+
) => readonly [TKey, TNewElement] | Promise<readonly [TKey, TNewElement]>
1183+
): (iterable: AsyncIterableLike<TElement>) => Promise<Map<TKey, TNewElement>> {
1184+
return async iterable => mapKeyFirstBy(iterable, f);
1185+
}
1186+
1187+
export const asyncMapKeyFirstByFn = mapKeyFirstByFn;

0 commit comments

Comments
 (0)