Skip to content

Commit acf5e82

Browse files
committed
feat(asyncFindOnce): add asyncFindOnce function
1 parent ef0fe97 commit acf5e82

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

index.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
asyncExcludeOnce,
1313
asyncFilterOnce,
1414
asyncFindIndexOnce,
15+
asyncFindOnce,
1516
asyncFold1Once,
1617
asyncFoldOnce,
1718
asyncIndexOfOnce,
@@ -438,3 +439,7 @@ test("asyncIndexOfOnce", async t => {
438439
test("asyncFindIndexOnce", async t => {
439440
t.is(await asyncFindIndexOnce(asyncIterator([1, 2, 3, 4, 3, 2, 1]), n => n >= 3), 2);
440441
});
442+
443+
test("asyncFindOnce", async t => {
444+
t.is(await asyncFindOnce(asyncIterator([1, 2, 3, 4, 3, 2, 1]), n => n >= 3), 3);
445+
});

index.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -766,3 +766,38 @@ export function asyncFindIndexOnceFn<T>(
766766
): (iterator: AsyncIteratorLike<T>) => Promise<number | null> {
767767
return async iterator => asyncFindIndexOnce(iterator, predicate);
768768
}
769+
770+
export async function asyncFindOnce<T, U extends T>(
771+
iterator: AsyncIteratorLike<T>,
772+
predicate: (element: T, index: number) => element is U
773+
): Promise<U | null>;
774+
export async function asyncFindOnce<T>(
775+
iterator: AsyncIteratorLike<T>,
776+
predicate: (element: T, index: number) => boolean | Promise<boolean>
777+
): Promise<T | null>;
778+
export async function asyncFindOnce<T>(
779+
iterator: AsyncIteratorLike<T>,
780+
predicate: (element: T, index: number) => boolean | Promise<boolean>
781+
): Promise<T | null> {
782+
const it = asyncIterator(iterator);
783+
let element = await it.next();
784+
for (let i = 0; element.done !== true; ++i) {
785+
if (await predicate(element.value, i)) {
786+
return element.value;
787+
}
788+
element = await it.next();
789+
}
790+
return null;
791+
}
792+
793+
export function asyncFindOnceFn<T, U extends T>(
794+
predicate: (element: T, index: number) => element is U
795+
): (iterator: AsyncIteratorLike<T>) => Promise<U | null>;
796+
export function asyncFindOnceFn<T>(
797+
predicate: (element: T, index: number) => boolean | Promise<boolean>
798+
): (iterator: AsyncIteratorLike<T>) => Promise<T | null>;
799+
export function asyncFindOnceFn<T>(
800+
predicate: (element: T, index: number) => boolean | Promise<boolean>
801+
): (iterator: AsyncIteratorLike<T>) => Promise<T | null> {
802+
return async iterator => asyncFindOnce(iterator, predicate);
803+
}

0 commit comments

Comments
 (0)