Skip to content

Commit 972a014

Browse files
committed
feat(asyncSliceOnce): add asyncSliceOnce function
1 parent 3c8dad2 commit 972a014

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed

index.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
asyncNotEmptyOnce,
99
asyncOnlyOnce,
1010
asyncPushOnce,
11+
asyncSliceOnce,
1112
asyncTailOnce,
1213
asyncToArrayOnce,
1314
asyncUnshiftOnce
@@ -146,3 +147,16 @@ test("asyncNotEmptyOnce", async t => {
146147
t.is(await asyncNotEmptyOnce(asyncIterator([1])), true);
147148
t.is(await asyncNotEmptyOnce(asyncIterator([1, 2, 3])), true);
148149
});
150+
151+
test("asyncSliceOnce", async t => {
152+
t.deepEqual(await asyncToArrayOnce(asyncSliceOnce(asyncIterator([1, 2, 3, 4]), 1)), [2, 3, 4]);
153+
t.deepEqual(
154+
await asyncToArrayOnce(asyncSliceOnce(asyncIterator([1, 2, 3, 4, 5]), 1, 4)),
155+
[2, 3, 4]
156+
);
157+
t.deepEqual(await asyncToArrayOnce(asyncSliceOnce(asyncIterator([1, 2, 3]), 2)), [3]);
158+
t.deepEqual(await asyncToArrayOnce(asyncSliceOnce(asyncIterator([1, 2, 3]), 0, 2)), [1, 2]);
159+
t.deepEqual(await asyncToArrayOnce(asyncSliceOnce(asyncIterator([]), 3, 5)), []);
160+
t.deepEqual(await asyncToArrayOnce(asyncSliceOnce(asyncIterator([1, 2, 3]), 2, 0)), []);
161+
t.deepEqual(await asyncToArrayOnce(asyncSliceOnce(asyncIterator([1, 2, 3]), 1, 1)), []);
162+
});

index.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,3 +194,56 @@ export async function asyncEmptyOnce<T>(iterator: AsyncIteratorLike<T>): Promise
194194
export async function asyncNotEmptyOnce<T>(iterator: AsyncIteratorLike<T>): Promise<boolean> {
195195
return (await asyncIterator(iterator).next()).done !== true;
196196
}
197+
198+
export function asyncSliceOnce<T>(
199+
iterator: AsyncIteratorLike<T>,
200+
start: number | Promise<number> = 0,
201+
end: number | Promise<number> = Infinity
202+
): AsyncIterator<T> {
203+
const it = asyncIterator(iterator);
204+
let i = 0;
205+
const done: IteratorResult<T> = {done: true, value: undefined};
206+
const first = async (): Promise<IteratorResult<T>> => {
207+
if ((await end) <= (await start)) {
208+
next = after;
209+
return done;
210+
} else {
211+
next = before;
212+
return before();
213+
}
214+
};
215+
const before = async (): Promise<IteratorResult<T>> => {
216+
let element = await it.next();
217+
const s = await start;
218+
while (i++ < s && element.done !== true) {
219+
element = await it.next();
220+
}
221+
222+
if (element.done === true) {
223+
next = after;
224+
return done;
225+
} else {
226+
next = during;
227+
return element;
228+
}
229+
};
230+
const during = async (): Promise<IteratorResult<T>> => {
231+
const element = await it.next();
232+
if (i++ < (await end) && element.done !== true) {
233+
return element;
234+
} else {
235+
next = after;
236+
return done;
237+
}
238+
};
239+
const after = async (): Promise<IteratorResult<T>> => done;
240+
let next = first;
241+
return {next: async () => next()};
242+
}
243+
244+
export function asyncSliceOnceFn<T>(
245+
start: number | Promise<number>,
246+
end: number | Promise<number> = Infinity
247+
): (iterator: AsyncIteratorLike<T>) => AsyncIterator<T> {
248+
return iterator => asyncSliceOnce(iterator, start, end);
249+
}

0 commit comments

Comments
 (0)