diff --git a/mod.ts b/mod.ts index 6dc59f1..ff5f7af 100644 --- a/mod.ts +++ b/mod.ts @@ -14,6 +14,7 @@ export * from "./src/product.ts"; export * from "./src/range.ts"; export * from "./src/reduce.ts"; export * from "./src/skip.ts"; +export * from "./src/stepBy.ts"; export * from "./src/sum.ts"; export * from "./src/take.ts"; export * from "./src/toArray.ts"; diff --git a/src/stepBy.ts b/src/stepBy.ts new file mode 100644 index 0000000..f06a4c6 --- /dev/null +++ b/src/stepBy.ts @@ -0,0 +1,45 @@ +export function stepBy(n: number): (_: Iterator) => Iterator { + return (iter) => { + let isFirstTake = true; + + return { + next() { + if (isFirstTake) { + isFirstTake = false; + return iter.next(); + } else { + for (let i = 0; i < n - 1; i++) { + const result = iter.next(); + if (result.done) return result; + } + + return iter.next(); + } + }, + }; + }; +} + +export function asyncStepBy( + n: number, +): (_: AsyncIterator) => AsyncIterator { + return (iter) => { + let isFirstTake = true; + + return { + async next() { + if (isFirstTake) { + isFirstTake = false; + return iter.next(); + } else { + for (let i = 0; i < n - 1; i++) { + const result = await iter.next(); + if (result.done) return result; + } + + return iter.next(); + } + }, + }; + }; +} diff --git a/src/stepBy_test.ts b/src/stepBy_test.ts new file mode 100644 index 0000000..642400b --- /dev/null +++ b/src/stepBy_test.ts @@ -0,0 +1,24 @@ +import { assertObjectMatch } from "../dev_deps.ts"; +import { toAsync } from "./toAsync.ts"; + +import { asyncStepBy, stepBy } from "./stepBy.ts"; + +Deno.test("skip", () => { + const a = [0, 1, 2, 3, 4, 5]; + + const iter = stepBy(2)(a.values()); + assertObjectMatch(iter.next(), { value: 0 }); + assertObjectMatch(iter.next(), { value: 2 }); + assertObjectMatch(iter.next(), { value: 4 }); + assertObjectMatch(iter.next(), { done: true }); +}); + +Deno.test("asyncSkip", async () => { + const a = [0, 1, 2, 3, 4, 5]; + + const iter = asyncStepBy(2)(toAsync(a.values())); + assertObjectMatch(await iter.next(), { value: 0 }); + assertObjectMatch(await iter.next(), { value: 2 }); + assertObjectMatch(await iter.next(), { value: 4 }); + assertObjectMatch(await iter.next(), { done: true }); +});