Skip to content

Commit b61ef21

Browse files
committed
feat(asyncMapKeyFirstByOnce): add asyncMapKeyFirstByOnce function
1 parent e2876d2 commit b61ef21

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

index.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import {
3131
asyncKeyLastByOnce,
3232
asyncLastOnce,
3333
asyncMapKeyByOnce,
34+
asyncMapKeyFirstByOnce,
3435
asyncMapOnce,
3536
asyncMaximumByOnce,
3637
asyncMaximumOnce,
@@ -682,3 +683,13 @@ test("asyncMapKeyByOnce", async t => {
682683
t.deepEqual(map.get("odd"), ["1", "3", "5"]);
683684
t.deepEqual(Array.from(map.keys()), ["odd", "even"]);
684685
});
686+
687+
test("asyncMapKeyFirstByOnce", async t => {
688+
const map = await asyncMapKeyFirstByOnce(asyncIterator([1, 3, 4, 2, 5, 6]), e => [
689+
e % 2 === 0 ? "even" : "odd",
690+
String(e)
691+
]);
692+
t.is(map.get("even"), "4");
693+
t.is(map.get("odd"), "1");
694+
t.deepEqual(Array.from(map.keys()), ["odd", "even"]);
695+
});

index.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1300,4 +1300,35 @@ export function asyncMapKeyByOnceFn<TKey, TElement, TNewElement>(
13001300
) => readonly [TKey, TNewElement] | Promise<readonly [TKey, TNewElement]>
13011301
): (iterator: AsyncIteratorLike<TElement>) => Promise<Map<TKey, readonly TNewElement[]>> {
13021302
return async iterator => asyncMapKeyByOnce(iterator, f);
1303-
}
1303+
}
1304+
1305+
export async function asyncMapKeyFirstByOnce<TKey, TElement, TNewElement>(
1306+
iterator: AsyncIteratorLike<TElement>,
1307+
f: (
1308+
element: TElement,
1309+
index: number
1310+
) => readonly [TKey, TNewElement] | Promise<readonly [TKey, TNewElement]>
1311+
): Promise<Map<TKey, TNewElement>> {
1312+
const it = asyncIterator(iterator);
1313+
const map = new Map<TKey, TNewElement>();
1314+
for (
1315+
let i = 0, element = await it.next();
1316+
element.done !== true;
1317+
++i, element = await it.next()
1318+
) {
1319+
const [key, value] = await f(element.value, i);
1320+
if (!map.has(key)) {
1321+
map.set(key, value);
1322+
}
1323+
}
1324+
return map;
1325+
}
1326+
1327+
export function asyncMapKeyFirstByOnceFn<TKey, TElement, TNewElement>(
1328+
f: (
1329+
element: TElement,
1330+
index: number
1331+
) => readonly [TKey, TNewElement] | Promise<readonly [TKey, TNewElement]>
1332+
): (iterator: AsyncIteratorLike<TElement>) => Promise<Map<TKey, TNewElement>> {
1333+
return async iterator => asyncMapKeyFirstByOnce(iterator, f);
1334+
}

0 commit comments

Comments
 (0)