async-iterator-helpers
Advanced tools
+9
-7
| { | ||
| "name": "async-iterator-helpers", | ||
| "version": "1.0.0", | ||
| "version": "1.0.1", | ||
| "description": "Utility functions for working with async iterators", | ||
| "type": "module", | ||
| "main": "./dist/index.js", | ||
| "types": "./dist/index.d.ts", | ||
| "exports": { | ||
| ".": { | ||
| "types": "./dist/index.d.ts", | ||
| "import": "./dist/index.js" | ||
| } | ||
| }, | ||
| "repository": { | ||
@@ -30,8 +38,2 @@ "type": "git", | ||
| ], | ||
| "exports": { | ||
| ".": { | ||
| "types": "./dist/index.d.ts", | ||
| "import": "./dist/index.js" | ||
| } | ||
| }, | ||
| "scripts": { | ||
@@ -38,0 +40,0 @@ "build": "tsdown", |
-132
| //#region src/index.ts | ||
| const DEFAULT_PARALLEL_LIMIT = (() => { | ||
| const envLimit = "process" in globalThis ? Number(globalThis.process.env.ASYNC_ITERATOR_HELPERS_PARALLEL_LIMIT) : NaN; | ||
| const hardLimit = 100; | ||
| return Math.min(Number.isFinite(envLimit) ? envLimit : 16, hardLimit); | ||
| })(); | ||
| var AsyncIterator = class AsyncIterator { | ||
| constructor(handle) { | ||
| this.handle = handle; | ||
| } | ||
| static from(handle) { | ||
| return new AsyncIterator(new AsyncIteratorHandle(handle, (value) => [1, value], 0, Infinity, DEFAULT_PARALLEL_LIMIT)); | ||
| } | ||
| map(f) { | ||
| return new AsyncIterator(this.handle.map(f)); | ||
| } | ||
| filter(f) { | ||
| return new AsyncIterator(this.handle.filter(f)); | ||
| } | ||
| take(n) { | ||
| return new AsyncIterator(this.handle.take(n)); | ||
| } | ||
| drop(n) { | ||
| return new AsyncIterator(this.handle.drop(n)); | ||
| } | ||
| parallel(limit) { | ||
| return new AsyncIterator(this.handle.parallel(Math.max(1, limit))); | ||
| } | ||
| flatMap(f) { | ||
| const handle = parGen(this.handle.parallelLimit, this.handle[Symbol.asyncIterator]()); | ||
| return AsyncIterator.from(async function* () { | ||
| for await (const value of handle) yield* f(value); | ||
| }()); | ||
| } | ||
| async toArray() { | ||
| const result = []; | ||
| for await (const value of this.handle) result.push(value); | ||
| return result; | ||
| } | ||
| async find(f) { | ||
| for await (const value of this.handle) if (await f(value)) return value; | ||
| return void 0; | ||
| } | ||
| async forEach(f) { | ||
| for await (const value of this.handle) f(value); | ||
| } | ||
| async reduce(f, initial) { | ||
| let acc = initial; | ||
| for await (const value of this.handle) acc = f(acc, value); | ||
| return acc; | ||
| } | ||
| async some(f) { | ||
| for await (const value of this.handle) if (await f(value)) return true; | ||
| return false; | ||
| } | ||
| async every(f) { | ||
| for await (const value of this.handle) if (!await f(value)) return false; | ||
| return true; | ||
| } | ||
| [Symbol.asyncIterator]() { | ||
| return this.handle[Symbol.asyncIterator](); | ||
| } | ||
| }; | ||
| var AsyncIteratorHandle = class AsyncIteratorHandle { | ||
| constructor(handle, fn, begin, length, parallelLimit) { | ||
| this.handle = handle; | ||
| this.fn = fn; | ||
| this.begin = begin; | ||
| this.length = length; | ||
| this.parallelLimit = parallelLimit; | ||
| } | ||
| async *[Symbol.asyncIterator]() { | ||
| let toSkip = this.begin; | ||
| let toTake = this.length; | ||
| for await (const value of parGen(this.parallelLimit, this.handle)) { | ||
| if (toSkip > 0) { | ||
| toSkip -= 1; | ||
| continue; | ||
| } | ||
| const [id, val] = await this.fn(value); | ||
| if (id === 0) continue; | ||
| if (toTake <= 0) break; | ||
| yield val; | ||
| toTake -= 1; | ||
| } | ||
| } | ||
| map(f) { | ||
| return new AsyncIteratorHandle(this.handle, async (t) => { | ||
| const [id, val] = await this.fn(t); | ||
| if (id === 0) return [0, null]; | ||
| return [1, await f(val)]; | ||
| }, this.begin, this.length, this.parallelLimit); | ||
| } | ||
| filter(f) { | ||
| return new AsyncIteratorHandle(this.handle, async (t) => { | ||
| const [id, val] = await this.fn(t); | ||
| if (id !== 0 && await f(val)) return [1, val]; | ||
| return [0, null]; | ||
| }, this.begin, this.length, this.parallelLimit); | ||
| } | ||
| take(n) { | ||
| return new AsyncIteratorHandle(this.handle, this.fn, this.begin, Math.min(n, this.length), this.parallelLimit); | ||
| } | ||
| drop(n) { | ||
| const amountToDrop = Math.min(n, this.length); | ||
| return new AsyncIteratorHandle(this.handle, this.fn, this.begin + amountToDrop, this.length - amountToDrop, this.parallelLimit); | ||
| } | ||
| parallel(limit) { | ||
| return new AsyncIteratorHandle(this.handle, this.fn, this.begin, this.length, limit); | ||
| } | ||
| }; | ||
| async function* parGen(limit, generatorLike) { | ||
| const generator = (() => { | ||
| if ("length" in generatorLike) return async function* () { | ||
| for (const value of Array.from(generatorLike)) yield Promise.resolve(await value); | ||
| }(); | ||
| return generatorLike; | ||
| })(); | ||
| const queue = []; | ||
| while (queue.length < limit) queue.push(generator.next().then((r) => r.done ? [0, null] : [1, r.value])); | ||
| while (queue.length > 0) { | ||
| const [id, value] = await queue.shift(); | ||
| if (id === 0) continue; | ||
| yield value; | ||
| queue.push(generator.next().then((r) => r.done ? [0, null] : [1, r.value])); | ||
| } | ||
| } | ||
| //#endregion | ||
| exports.AsyncIterator = AsyncIterator; | ||
| //# sourceMappingURL=index.cjs.map |
| {"version":3,"file":"index.cjs","names":["handle: AsyncIteratorHandle<any, T>","handle: AsyncGenerator<T> | ArrayLike<MaybePromise<T>>","f: (value: T) => MaybePromise<U>","f: (value: T) => MaybePromise<boolean>","n: number","limit: number","f: (value: T) => AsyncGenerator<MaybePromise<U>> | MaybePromise<U>[]","result: T[]","f: (value: T) => void","f: (acc: R, value: T) => R","initial: R","fn: (value: T) => MaybePromise<Option<U>>","begin: number","length: number","parallelLimit: number","f: (value: U) => MaybePromise<V>","f: (value: U) => MaybePromise<boolean>","generatorLike: AsyncGenerator<T> | ArrayLike<MaybePromise<T>>","queue: Promise<Option<T>>[]"],"sources":["../src/index.ts"],"sourcesContent":["import { readSync } from \"fs\";\n\nconst DEFAULT_PARALLEL_LIMIT = (() => {\n const envLimit = 'process' in globalThis ? Number(globalThis.process.env.ASYNC_ITERATOR_HELPERS_PARALLEL_LIMIT) : NaN;\n const hardLimit = 100;\n return Math.min(Number.isFinite(envLimit) ? envLimit : 16, hardLimit);\n})();\n\nexport class AsyncIterator<T> {\n private constructor(private readonly handle: AsyncIteratorHandle<any, T>) { }\n\n static from<T>(handle: AsyncGenerator<T> | ArrayLike<MaybePromise<T>>): AsyncIterator<T> {\n return new AsyncIterator(new AsyncIteratorHandle(handle, (value) => [1, value], 0, Infinity, DEFAULT_PARALLEL_LIMIT));\n }\n\n map<U>(f: (value: T) => MaybePromise<U>): AsyncIterator<U> {\n return new AsyncIterator(this.handle.map(f));\n }\n\n filter(f: (value: T) => MaybePromise<boolean>): AsyncIterator<T> {\n return new AsyncIterator(this.handle.filter(f));\n }\n\n take(n: number): AsyncIterator<T> {\n return new AsyncIterator(this.handle.take(n));\n }\n\n drop(n: number): AsyncIterator<T> {\n return new AsyncIterator(this.handle.drop(n));\n }\n\n parallel(limit: number): AsyncIterator<T> {\n return new AsyncIterator(this.handle.parallel(Math.max(1, limit)));\n }\n\n flatMap<U>(f: (value: T) => AsyncGenerator<MaybePromise<U>> | MaybePromise<U>[]): AsyncIterator<U> {\n const handle = parGen(this.handle.parallelLimit, this.handle[Symbol.asyncIterator]());\n return AsyncIterator.from(async function* () {\n for await (const value of handle) {\n yield* f(value);\n }\n }());\n }\n\n async toArray(): Promise<T[]> {\n const result: T[] = [];\n for await (const value of this.handle) {\n result.push(value);\n }\n return result;\n }\n\n async find(f: (value: T) => MaybePromise<boolean>): Promise<T | undefined> {\n for await (const value of this.handle) {\n if (await f(value)) return value;\n }\n return undefined;\n }\n\n async forEach(f: (value: T) => void): Promise<void> {\n for await (const value of this.handle) {\n f(value);\n }\n }\n\n async reduce<R>(f: (acc: R, value: T) => R, initial: R): Promise<R> {\n let acc = initial;\n for await (const value of this.handle) {\n acc = f(acc, value);\n }\n return acc;\n }\n\n async some(f: (value: T) => MaybePromise<boolean>): Promise<boolean> {\n for await (const value of this.handle) {\n if (await f(value)) return true;\n }\n return false;\n }\n\n async every(f: (value: T) => MaybePromise<boolean>): Promise<boolean> {\n for await (const value of this.handle) {\n if (!(await f(value))) return false;\n }\n return true;\n }\n\n [Symbol.asyncIterator](): AsyncGenerator<T> {\n return this.handle[Symbol.asyncIterator]();\n }\n}\n\nclass AsyncIteratorHandle<T, U> {\n constructor(\n private readonly handle: AsyncGenerator<T> | ArrayLike<MaybePromise<T>>,\n private readonly fn: (value: T) => MaybePromise<Option<U>>,\n private readonly begin: number,\n private readonly length: number,\n readonly parallelLimit: number,\n ) { }\n\n async *[Symbol.asyncIterator](): AsyncGenerator<U> {\n let toSkip = this.begin;\n let toTake = this.length;\n for await (const value of parGen(this.parallelLimit, this.handle)) {\n if (toSkip > 0) {\n toSkip -= 1;\n continue;\n }\n const [id, val] = await this.fn(value);\n if (id === 0) continue;\n if (toTake <= 0) break;\n yield val;\n toTake -= 1;\n }\n }\n\n map<V>(f: (value: U) => MaybePromise<V>): AsyncIteratorHandle<T, V> {\n return new AsyncIteratorHandle(this.handle, async t => {\n const [id, val] = await this.fn(t);\n if (id === 0) return [0, null];\n return [1, await f(val)];\n }, this.begin, this.length, this.parallelLimit);\n }\n\n filter(f: (value: U) => MaybePromise<boolean>): AsyncIteratorHandle<T, U> {\n return new AsyncIteratorHandle(this.handle, async t => {\n const [id, val] = await this.fn(t);\n if (id !== 0 && (await f(val))) return [1, val];\n return [0, null];\n }, this.begin, this.length, this.parallelLimit);\n }\n\n take(n: number): AsyncIteratorHandle<T, U> {\n return new AsyncIteratorHandle(this.handle, this.fn, this.begin, Math.min(n, this.length), this.parallelLimit);\n }\n\n drop(n: number): AsyncIteratorHandle<T, U> {\n const amountToDrop = Math.min(n, this.length);\n return new AsyncIteratorHandle(this.handle, this.fn, this.begin + amountToDrop, this.length - amountToDrop, this.parallelLimit);\n }\n\n parallel(limit: number): AsyncIteratorHandle<T, U> {\n return new AsyncIteratorHandle(this.handle, this.fn, this.begin, this.length, limit);\n }\n}\n\ntype MaybePromise<T> = T | Promise<T>;\ntype Option<T> = [0, null] | [1, T];\n\nasync function* parGen<T>(limit: number, generatorLike: AsyncGenerator<T> | ArrayLike<MaybePromise<T>>): AsyncGenerator<T> {\n const generator = ((): AsyncGenerator<T> => {\n if ('length' in generatorLike) {\n return (async function* () {\n for (const value of Array.from(generatorLike)) {\n yield Promise.resolve(await value);\n }\n })();\n }\n return generatorLike\n })();\n\n const queue: Promise<Option<T>>[] = [];\n while (queue.length < limit) {\n queue.push(generator.next().then((r): Option<T> => r.done ? [0, null] : [1, r.value]));\n }\n\n while (queue.length > 0) {\n const [id, value] = await queue.shift()!;\n if (id === 0) continue;\n yield value;\n queue.push(generator.next().then((r): Option<T> => r.done ? [0, null] : [1, r.value]));\n }\n}\n"],"mappings":"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"} |
| //#region src/index.d.ts | ||
| declare class AsyncIterator<T> { | ||
| private readonly handle; | ||
| private constructor(); | ||
| static from<T>(handle: AsyncGenerator<T> | ArrayLike<MaybePromise<T>>): AsyncIterator<T>; | ||
| map<U>(f: (value: T) => MaybePromise<U>): AsyncIterator<U>; | ||
| filter(f: (value: T) => MaybePromise<boolean>): AsyncIterator<T>; | ||
| take(n: number): AsyncIterator<T>; | ||
| drop(n: number): AsyncIterator<T>; | ||
| parallel(limit: number): AsyncIterator<T>; | ||
| flatMap<U>(f: (value: T) => AsyncGenerator<MaybePromise<U>> | MaybePromise<U>[]): AsyncIterator<U>; | ||
| toArray(): Promise<T[]>; | ||
| find(f: (value: T) => MaybePromise<boolean>): Promise<T | undefined>; | ||
| forEach(f: (value: T) => void): Promise<void>; | ||
| reduce<R>(f: (acc: R, value: T) => R, initial: R): Promise<R>; | ||
| some(f: (value: T) => MaybePromise<boolean>): Promise<boolean>; | ||
| every(f: (value: T) => MaybePromise<boolean>): Promise<boolean>; | ||
| [Symbol.asyncIterator](): AsyncGenerator<T>; | ||
| } | ||
| type MaybePromise<T> = T | Promise<T>; | ||
| //#endregion | ||
| export { AsyncIterator }; | ||
| //# sourceMappingURL=index.d.cts.map |
| {"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":";cAQa;EAAA,iBAAa,MAAA;EAAA,QAAA,WAAA,CAAA;EAAA,OAGc,IAAA,CAAA,CAAA,CAAA,CAAA,MAAA,EAAf,cAAe,CAAA,CAAA,CAAA,GAAK,SAAL,CAAe,YAAf,CAA4B,CAA5B,CAAA,CAAA,CAAA,EAAkC,aAAlC,CAAgD,CAAhD,CAAA;EAAC,GAAhB,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,KAAA,EAIL,CAJK,EAAA,GAIC,YAJD,CAIc,CAJd,CAAA,CAAA,EAImB,aAJnB,CAIiC,CAJjC,CAAA;EAAc,MAA6B,CAAA,CAAA,EAAA,CAAA,KAAA,EAQhD,CARgD,EAAA,GAQ1C,YAR0C,CAAA,OAAA,CAAA,CAAA,EAQlB,aARkB,CAQJ,CARI,CAAA;EAAC,IAAd,CAAA,CAAA,EAAA,MAAA,CAAA,EAYpC,aAZoC,CAYtB,CAZsB,CAAA;EAAY,IAAtB,CAAA,CAAA,EAAA,MAAA,CAAA,EAgB1B,aAhB0B,CAgBZ,CAhBY,CAAA;EAAS,QAAkC,CAAA,KAAA,EAAA,MAAA,CAAA,EAoB7D,aApB6D,CAoB/C,CApB+C,CAAA;EAAC,OAAf,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,KAAA,EAwBlD,CAxBkD,EAAA,GAwB5C,cAxB4C,CAwB7B,YAxB6B,CAwBhB,CAxBgB,CAAA,CAAA,GAwBV,YAxBU,CAwBG,CAxBH,CAAA,EAAA,CAAA,EAwBU,aAxBV,CAwBwB,CAxBxB,CAAA;EAAa,OAInE,CAAA,CAAA,EA6BD,OA7BC,CA6BO,CA7BP,EAAA,CAAA;EAAC,IAAkB,CAAA,CAAA,EAAA,CAAA,KAAA,EAqCf,CArCe,EAAA,GAqCT,YArCS,CAAA,OAAA,CAAA,CAAA,EAqCe,OArCf,CAqCuB,CArCvB,GAAA,SAAA,CAAA;EAAC,OAAd,CAAA,CAAA,EAAA,CAAA,KAAA,EA4CC,CA5CD,EAAA,GAAA,IAAA,CAAA,EA4Cc,OA5Cd,CAAA,IAAA,CAAA;EAAY,MAAoB,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,GAAA,EAkD/B,CAlD+B,EAAA,KAAA,EAkDrB,CAlDqB,EAAA,GAkDf,CAlDe,EAAA,OAAA,EAkDH,CAlDG,CAAA,EAkDC,OAlDD,CAkDS,CAlDT,CAAA;EAAC,IAAf,CAAA,CAAA,EAAA,CAAA,KAAA,EA0DpB,CA1DoB,EAAA,GA0Dd,YA1Dc,CAAA,OAAA,CAAA,CAAA,EA0DU,OA1DV,CAAA,OAAA,CAAA;EAAa,KAIrC,CAAA,CAAA,EAAA,CAAA,KAAA,EA6DK,CA7DL,EAAA,GA6DW,YA7DX,CAAA,OAAA,CAAA,CAAA,EA6DmC,OA7DnC,CAAA,OAAA,CAAA;EAAC,CAoElB,MAAA,CAAO,aAAA,GApEgB,EAoEE,cApEF,CAoEiB,CApEjB,CAAA;;KAgIrB,YAhI6C,CAAA,CAAA,CAAA,GAgI3B,CAhI2B,GAgIvB,OAhIuB,CAgIf,CAhIe,CAAA"} |
3
-25%24391
-40.09%8
-33.33%298
-30.21%