Skip to content

Commit 7a692d8

Browse files
committed
feat(asyncDropUntilOnce): add asyncDropUntilOnce function
1 parent 38116c6 commit 7a692d8

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

index.test.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type {ExecutionContext} from "ava";
22
import test from "ava";
33
import {
44
asyncDropOnce,
5+
asyncDropUntilOnce,
56
asyncDropWhileOnce,
67
asyncEmptyOnce,
78
asyncInitialOnce,
@@ -256,3 +257,30 @@ test("asyncDropWhileOnce", async t => {
256257
[4, 3, 2, 1]
257258
);
258259
});
260+
261+
test("asyncDropUntilOnce", async t => {
262+
t.deepEqual(
263+
await asyncToArrayOnce(asyncDropUntilOnce(asyncIterator([]), (_, i) => i >= 3)),
264+
[]
265+
);
266+
t.deepEqual(
267+
await asyncToArrayOnce(asyncDropUntilOnce(asyncIterator([1, 2]), (_, i) => i >= 3)),
268+
[]
269+
);
270+
t.deepEqual(
271+
await asyncToArrayOnce(
272+
asyncDropUntilOnce(asyncIterator([1, 2, 3, 4, 5]), (_, i) => i >= 3)
273+
),
274+
[4, 5]
275+
);
276+
t.deepEqual(
277+
await asyncToArrayOnce(asyncDropUntilOnce(asyncIterator([1, 2, 3, 4, 5]), () => true)),
278+
[1, 2, 3, 4, 5]
279+
);
280+
t.deepEqual(
281+
await asyncToArrayOnce(
282+
asyncDropUntilOnce(asyncIterator([1, 2, 3, 4, 3, 2, 1]), e => e >= 4)
283+
),
284+
[4, 3, 2, 1]
285+
);
286+
});

index.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,3 +395,28 @@ export function asyncDropWhileOnceFn<T>(
395395
): (iterator: AsyncIteratorLike<T>) => AsyncIterator<T> {
396396
return iterator => asyncDropWhileOnce(iterator, predicate);
397397
}
398+
399+
export function asyncDropUntilOnce<T>(
400+
iterator: AsyncIteratorLike<T>,
401+
predicate: (element: T, index: number) => boolean | Promise<boolean>
402+
): AsyncIterator<T> {
403+
const it = asyncIterator(iterator);
404+
let i = 0;
405+
const before = async (): Promise<IteratorResult<T>> => {
406+
let element = await it.next();
407+
while (element.done !== true && !(await predicate(element.value, i++))) {
408+
element = await it.next();
409+
}
410+
next = during;
411+
return element;
412+
};
413+
const during = async (): Promise<IteratorResult<T>> => it.next();
414+
let next = before;
415+
return {next: async () => next()};
416+
}
417+
418+
export function asyncDropUntilOnceFn<T>(
419+
predicate: (element: T, index: number) => boolean | Promise<boolean>
420+
): (iterator: AsyncIteratorLike<T>) => AsyncIterator<T> {
421+
return iterator => asyncDropUntilOnce(iterator, predicate);
422+
}

0 commit comments

Comments
 (0)