Skip to content

Commit c1153f3

Browse files
committed
feat(asyncMapOnce): add asyncMapOnce function
1 parent 84d464c commit c1153f3

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

index.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
asyncInitialOnce,
1010
asyncIterator,
1111
asyncLastOnce,
12+
asyncMapOnce,
1213
asyncNotEmptyOnce,
1314
asyncNotEqualOnce,
1415
asyncOnlyOnce,
@@ -335,3 +336,16 @@ test("asyncPrefixMatchOnce", async t => {
335336
t.false(await asyncPrefixMatchOnce(asyncIterator([1, 3, 4]), asyncIterator([1, 2])));
336337
t.false(await asyncPrefixMatchOnce(asyncIterator([]), asyncIterator([1])));
337338
});
339+
340+
test("asyncMapOnce", async t => {
341+
t.deepEqual(
342+
await asyncToArrayOnce(asyncMapOnce(asyncIterator([1, 2, 3]), e => e + 1)),
343+
[2, 3, 4]
344+
);
345+
t.deepEqual(
346+
await asyncToArrayOnce(
347+
asyncMapOnce(asyncIterator([1, 2, 3]), (e, i) => (i === 1 ? e * 10 : e))
348+
),
349+
[1, 20, 3]
350+
);
351+
});

index.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,3 +479,30 @@ export async function asyncPrefixMatchOnce<T>(
479479
}
480480
return bElement.done === true;
481481
}
482+
483+
export function asyncMapOnce<T, U>(
484+
iterator: AsyncIteratorLike<T>,
485+
f: (element: T, index: number) => U
486+
): AsyncIterator<U> {
487+
const it = asyncIterator(iterator);
488+
let i = 0;
489+
const done: IteratorResult<U> = {done: true, value: undefined};
490+
const during = async (): Promise<IteratorResult<U>> => {
491+
const element = await it.next();
492+
if (element.done === true) {
493+
next = after;
494+
return done;
495+
} else {
496+
return {value: f(element.value, i++)};
497+
}
498+
};
499+
const after = async (): Promise<IteratorResult<U>> => done;
500+
let next = during;
501+
return {next: async () => next()};
502+
}
503+
504+
export function asyncMapOnceFn<T, U>(
505+
f: (element: T, index: number) => U
506+
): (iterator: AsyncIteratorLike<T>) => AsyncIterator<U> {
507+
return iterator => asyncMapOnce(iterator, f);
508+
}

0 commit comments

Comments
 (0)