Skip to content

Commit d3e04af

Browse files
committed
feat(asyncExcludeFirstOnce): add asyncExcludeFirstOnce function
1 parent a9386a7 commit d3e04af

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

index.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
asyncDropWhileOnce,
77
asyncEmptyOnce,
88
asyncEqualOnce,
9+
asyncExcludeFirstOnce,
910
asyncExcludeNullOnce,
1011
asyncExcludeOnce,
1112
asyncFilterOnce,
@@ -379,3 +380,12 @@ test("asyncExcludeNullOnce", async t => {
379380
"b"
380381
]);
381382
});
383+
384+
test("asyncExcludeFirstOnce", async t => {
385+
t.deepEqual(
386+
await asyncToArrayOnce(
387+
asyncExcludeFirstOnce(asyncIterator([1, 2, 3, 4, 3, 2, 1]), n => n > 2)
388+
),
389+
[1, 2, 4, 3, 2, 1]
390+
);
391+
});

index.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -573,3 +573,28 @@ export function asyncExcludeNullOnce<T>(
573573
): AsyncIterator<T> {
574574
return asyncFilterOnce(iterator, isNotNull);
575575
}
576+
577+
export function asyncExcludeFirstOnce<T>(
578+
iterator: AsyncIteratorLike<T>,
579+
predicate: (element: T, index: number) => boolean | Promise<boolean>
580+
): AsyncIterator<T> {
581+
const it = asyncIterator(iterator);
582+
let i = 0;
583+
const before = async (): Promise<IteratorResult<T>> => {
584+
const element = await it.next();
585+
if (element.done !== true && !(await predicate(element.value, i++))) {
586+
return element;
587+
}
588+
next = after;
589+
return it.next();
590+
};
591+
const after = async (): Promise<IteratorResult<T>> => it.next();
592+
let next = before;
593+
return {next: async () => next()};
594+
}
595+
596+
export function asyncExcludeFirstOnceFn<T>(
597+
predicate: (element: T, index: number) => boolean | Promise<boolean>
598+
): (iterator: AsyncIteratorLike<T>) => AsyncIterator<T> {
599+
return iterator => asyncExcludeFirstOnce(iterator, predicate);
600+
}

0 commit comments

Comments
 (0)