stack-base-iterator
Advanced tools
| import LinkedList from './LinkedList.js'; | ||
| import type { EachDoneCallback, EachFunction, ForEachOptions, ProcessCallback, Processor, StackFunction, StackOptions } from './types.js'; | ||
| import type { EachDoneCallback, EachFunction, ForEachOptions, ProcessCallback, Processor, StackOptions, ValueCallback } from './types.js'; | ||
| export type StackFunction<T, TReturn = unknown, TNext = unknown> = (iterator: StackBaseIterator<T, TReturn, TNext>, callback: ValueCallback<T>) => void; | ||
| declare const Symbol: SymbolConstructor; | ||
| export { default as LinkedList } from './LinkedList.js'; | ||
| export type * from './types.js'; | ||
| export { default as LinkedList } from './LinkedList.js'; | ||
| export default class StackBaseIterator<T, TReturn = unknown, TNext = unknown> implements AsyncIterableIterator<T, TReturn, TNext> { | ||
| protected done: boolean; | ||
| protected stack: StackFunction<T>[]; | ||
| protected stack: StackFunction<T, TReturn, TNext>[]; | ||
| protected queued: ProcessCallback<T>[]; | ||
@@ -16,3 +17,3 @@ protected processors: LinkedList<Processor>; | ||
| isDone(): boolean; | ||
| push(fn: StackFunction<T>, ...rest: StackFunction<T>[]): void; | ||
| push(fn: StackFunction<T, TReturn, TNext>, ...rest: StackFunction<T, TReturn, TNext>[]): void; | ||
| next(): Promise<IteratorResult<T, TReturn>>; | ||
@@ -22,4 +23,5 @@ [Symbol.asyncIterator](): AsyncIterableIterator<T, TReturn, TNext>; | ||
| end(err?: Error): void; | ||
| pump(): void; | ||
| destroy(err?: Error): void; | ||
| private _pump; | ||
| private _processOrQueue; | ||
| } |
| import LinkedList from './LinkedList.js'; | ||
| import type { EachDoneCallback, EachFunction, ForEachOptions, ProcessCallback, Processor, StackFunction, StackOptions } from './types.js'; | ||
| import type { EachDoneCallback, EachFunction, ForEachOptions, ProcessCallback, Processor, StackOptions, ValueCallback } from './types.js'; | ||
| export type StackFunction<T, TReturn = unknown, TNext = unknown> = (iterator: StackBaseIterator<T, TReturn, TNext>, callback: ValueCallback<T>) => void; | ||
| declare const Symbol: SymbolConstructor; | ||
| export { default as LinkedList } from './LinkedList.js'; | ||
| export type * from './types.js'; | ||
| export { default as LinkedList } from './LinkedList.js'; | ||
| export default class StackBaseIterator<T, TReturn = unknown, TNext = unknown> implements AsyncIterableIterator<T, TReturn, TNext> { | ||
| protected done: boolean; | ||
| protected stack: StackFunction<T>[]; | ||
| protected stack: StackFunction<T, TReturn, TNext>[]; | ||
| protected queued: ProcessCallback<T>[]; | ||
@@ -16,3 +17,3 @@ protected processors: LinkedList<Processor>; | ||
| isDone(): boolean; | ||
| push(fn: StackFunction<T>, ...rest: StackFunction<T>[]): void; | ||
| push(fn: StackFunction<T, TReturn, TNext>, ...rest: StackFunction<T, TReturn, TNext>[]): void; | ||
| next(): Promise<IteratorResult<T, TReturn>>; | ||
@@ -22,4 +23,5 @@ [Symbol.asyncIterator](): AsyncIterableIterator<T, TReturn, TNext>; | ||
| end(err?: Error): void; | ||
| pump(): void; | ||
| destroy(err?: Error): void; | ||
| private _pump; | ||
| private _processOrQueue; | ||
| } |
+49
-16
@@ -19,8 +19,7 @@ "use strict"; | ||
| }); | ||
| var _calloncefn = /*#__PURE__*/ _interop_require_default(require("call-once-fn")); | ||
| var _asynccompat = /*#__PURE__*/ _interop_require_default(require("async-compat")); | ||
| var _iteratornextcallback = /*#__PURE__*/ _interop_require_default(require("iterator-next-callback")); | ||
| var _maximizeiterator = require("maximize-iterator"); | ||
| var _pinkiepromise = /*#__PURE__*/ _interop_require_default(require("pinkie-promise")); | ||
| var _LinkedList = /*#__PURE__*/ _interop_require_default(require("./LinkedList.js")); | ||
| var _maximizeiterator = require("maximize-iterator"); | ||
| var _processOrQueue = /*#__PURE__*/ _interop_require_default(require("./processOrQueue.js")); | ||
| function _class_call_check(instance, Constructor) { | ||
@@ -64,3 +63,3 @@ if (!(instance instanceof Constructor)) { | ||
| } | ||
| // biome-ignore lint/suspicious/noShadowRestrictedNames: <explanation> | ||
| // biome-ignore lint/suspicious/noShadowRestrictedNames: Legacy | ||
| var Symbol = typeof global.Symbol === 'undefined' ? { | ||
@@ -79,4 +78,4 @@ asyncIterator: '@@' | ||
| this.done = false; | ||
| this.stack = new Array(); | ||
| this.queued = new Array(); | ||
| this.stack = []; | ||
| this.queued = []; | ||
| this.processors = new _LinkedList.default(); | ||
@@ -99,3 +98,3 @@ this.processing = new _LinkedList.default(); | ||
| }); | ||
| this.pump(); | ||
| this._pump(); | ||
| }; | ||
@@ -105,5 +104,5 @@ _proto.next = function next() { | ||
| return new _pinkiepromise.default(function(resolve, reject) { | ||
| (0, _processOrQueue.default)(_this, (0, _calloncefn.default)(function(err, result) { | ||
| _this._processOrQueue(function(err, result) { | ||
| err ? reject(err) : resolve(result); | ||
| })); | ||
| }); | ||
| }); | ||
@@ -150,3 +149,3 @@ }; | ||
| this.processors.push(processor); | ||
| this.pump(); | ||
| this._pump(); | ||
| return; | ||
@@ -174,13 +173,47 @@ } | ||
| }; | ||
| _proto.pump = function pump() { | ||
| _proto.destroy = function destroy(err) { | ||
| if (this.destroyed) throw new Error('Already destroyed'); | ||
| this.destroyed = true; | ||
| this.end(err); | ||
| }; | ||
| _proto._pump = function _pump() { | ||
| if (!this.done && this.processors.length > 0 && this.stack.length > 0 && this.stack.length > this.queued.length) this.processors.last()(false); // try to queue more | ||
| while(this.stack.length > 0 && this.queued.length > 0){ | ||
| (0, _processOrQueue.default)(this, this.queued.pop()); | ||
| this._processOrQueue(this.queued.pop()); | ||
| if (!this.done && this.processors.length > 0 && this.stack.length > 0 && this.stack.length > this.queued.length) this.processors.last()(false); // try to queue more | ||
| } | ||
| }; | ||
| _proto.destroy = function destroy(err) { | ||
| if (this.destroyed) throw new Error('Already destroyed'); | ||
| this.destroyed = true; | ||
| this.end(err); | ||
| _proto._processOrQueue = function _processOrQueue(callback) { | ||
| var _this = this; | ||
| if (this.done) { | ||
| callback(null, { | ||
| done: true, | ||
| value: null | ||
| }); | ||
| return; | ||
| } | ||
| // nothing to process so queue | ||
| if (this.stack.length === 0) { | ||
| this.queued.push(callback); | ||
| return; | ||
| } | ||
| // process next | ||
| var next = this.stack.pop(); | ||
| this.processing.push(callback); | ||
| next(this, function(err, result) { | ||
| _this.processing.remove(callback); | ||
| // done | ||
| if (_this.done) return callback(null, { | ||
| done: true, | ||
| value: null | ||
| }); | ||
| // skip error | ||
| if (err && _asynccompat.default.defaultValue(_this.options.error(err), true)) err = null; | ||
| // handle callback | ||
| if (err) callback(err); | ||
| else if (!result) _this._processOrQueue(callback); | ||
| else callback(null, result); | ||
| // done | ||
| if (_this.stack.length === 0 && _this.processing.length === 0 && !_this.done) _this.end(); // end | ||
| }); | ||
| }; | ||
@@ -187,0 +220,0 @@ return StackBaseIterator; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/stack-base-iterator/src/index.ts"],"sourcesContent":["import once from 'call-once-fn';\nimport nextCallback from 'iterator-next-callback';\nimport Pinkie from 'pinkie-promise';\nimport LinkedList from './LinkedList.js';\n\nimport { createProcessor } from 'maximize-iterator';\nimport processOrQueue from './processOrQueue.js';\n\nimport type { AbstractIterator, EachDoneCallback, EachFunction, ForEachOptions, ProcessCallback, Processor, ProcessorOptions, StackFunction, StackOptions } from './types.js';\n\n// biome-ignore lint/suspicious/noShadowRestrictedNames: <explanation>\nconst Symbol: SymbolConstructor = typeof global.Symbol === 'undefined' ? ({ asyncIterator: '@@' } as unknown as SymbolConstructor) : global.Symbol;\n\nexport type * from './types.js';\nexport { default as LinkedList } from './LinkedList.js';\nexport default class StackBaseIterator<T, TReturn = unknown, TNext = unknown> implements AsyncIterableIterator<T, TReturn, TNext> {\n protected done: boolean;\n protected stack: StackFunction<T>[];\n protected queued: ProcessCallback<T>[];\n protected processors: LinkedList<Processor>;\n protected processing: LinkedList<ProcessCallback<T>>;\n\n protected options: StackOptions;\n protected destroyed: boolean;\n\n constructor(options: StackOptions = {}) {\n this.options = { ...options };\n this.options.error =\n options.error ||\n function defaultError(err) {\n return !!err; // fail on errors\n };\n\n this.done = false;\n this.stack = new Array<StackFunction<T>>();\n this.queued = new Array<ProcessCallback<T>>();\n this.processors = new LinkedList<Processor>();\n this.processing = new LinkedList<ProcessCallback<T>>();\n }\n\n isDone() {\n return this.done;\n }\n\n push(fn: StackFunction<T>, ...rest: StackFunction<T>[]) {\n if (this.done) return console.log('Attempting to push on a done iterator');\n this.stack.push(fn);\n !rest.length || rest.forEach((x) => this.stack.push(x));\n this.pump();\n }\n\n next(): Promise<IteratorResult<T, TReturn>> {\n return new Pinkie((resolve, reject) => {\n processOrQueue<T, TReturn>(\n this as unknown as AbstractIterator<T>,\n once((err, result: IteratorResult<T, TReturn>) => {\n err ? reject(err) : resolve(result);\n }) as ProcessCallback<T>\n );\n });\n }\n\n [Symbol.asyncIterator](): AsyncIterableIterator<T, TReturn, TNext> {\n return this;\n }\n\n forEach(fn: EachFunction<T>, options?: ForEachOptions | EachDoneCallback, callback?: EachDoneCallback): undefined | Promise<boolean> {\n if (typeof fn !== 'function') throw new Error('Missing each function');\n if (typeof options === 'function') {\n callback = options as EachDoneCallback;\n options = {};\n }\n\n if (typeof callback === 'function') {\n if (this.done) {\n callback(null, true);\n return;\n }\n options = options || {};\n const processorOptions: ProcessorOptions<T> = {\n each: fn,\n callbacks: options.callbacks || false,\n concurrency: options.concurrency || 1,\n limit: options.limit || Infinity,\n error:\n options.error ||\n function defaultError() {\n return true; // default is exit on error\n },\n total: 0,\n counter: 0,\n canProcess: () => {\n return !this.done && this.stack.length > 0 && this.queued.length < this.stack.length;\n },\n };\n\n let processor = createProcessor<T>(nextCallback<T, TReturn, TNext>(this), processorOptions, (err) => {\n if (!this.destroyed) this.processors.remove(processor);\n processor = null;\n options = null;\n const done = !this.stack.length;\n if ((err || done) && !this.done) this.end(err);\n return callback(err, this.done || done);\n });\n this.processors.push(processor);\n this.pump();\n return;\n }\n\n return new Promise((resolve, reject) =>\n this.forEach(fn, options, (err?: Error, done?: boolean) => {\n err ? reject(err) : resolve(done);\n })\n );\n }\n\n end(err?: Error) {\n if (this.done) return;\n this.done = true;\n while (this.processors.length > 0) this.processors.pop()(err || true);\n while (this.processing.length > 0) err ? this.processing.pop()(err) : this.processing.pop()(null, { done: true, value: null });\n while (this.queued.length > 0) err ? this.queued.pop()(err) : this.queued.pop()(null, { done: true, value: null });\n while (this.stack.length > 0) this.stack.pop();\n }\n\n pump() {\n if (!this.done && this.processors.length > 0 && this.stack.length > 0 && this.stack.length > this.queued.length) this.processors.last()(false); // try to queue more\n while (this.stack.length > 0 && this.queued.length > 0) {\n processOrQueue<T, TReturn>(this as unknown as AbstractIterator<T>, this.queued.pop());\n if (!this.done && this.processors.length > 0 && this.stack.length > 0 && this.stack.length > this.queued.length) this.processors.last()(false); // try to queue more\n }\n }\n\n destroy(err?: Error) {\n if (this.destroyed) throw new Error('Already destroyed');\n this.destroyed = true;\n this.end(err);\n }\n}\n"],"names":["LinkedList","StackBaseIterator","Symbol","global","asyncIterator","options","error","defaultError","err","done","stack","Array","queued","processors","processing","isDone","push","fn","rest","console","log","length","forEach","x","pump","next","Pinkie","resolve","reject","processOrQueue","once","result","callback","Error","processorOptions","each","callbacks","concurrency","limit","Infinity","total","counter","canProcess","processor","createProcessor","nextCallback","destroyed","remove","end","Promise","pop","value","last","destroy"],"mappings":"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"} | ||
| {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/stack-base-iterator/src/index.ts"],"sourcesContent":["import compat from 'async-compat';\nimport nextCallback from 'iterator-next-callback';\nimport { createProcessor } from 'maximize-iterator';\nimport Pinkie from 'pinkie-promise';\nimport LinkedList from './LinkedList.js';\n\nimport type { EachDoneCallback, EachFunction, ForEachOptions, ProcessCallback, Processor, ProcessorOptions, StackOptions, ValueCallback } from './types.js';\n\nexport type StackFunction<T, TReturn = unknown, TNext = unknown> = (iterator: StackBaseIterator<T, TReturn, TNext>, callback: ValueCallback<T>) => void;\n\n// biome-ignore lint/suspicious/noShadowRestrictedNames: Legacy\nconst Symbol: SymbolConstructor = typeof global.Symbol === 'undefined' ? ({ asyncIterator: '@@' } as unknown as SymbolConstructor) : global.Symbol;\n\nexport { default as LinkedList } from './LinkedList.js';\nexport type * from './types.js';\nexport default class StackBaseIterator<T, TReturn = unknown, TNext = unknown> implements AsyncIterableIterator<T, TReturn, TNext> {\n protected done: boolean;\n protected stack: StackFunction<T, TReturn, TNext>[];\n protected queued: ProcessCallback<T>[];\n protected processors: LinkedList<Processor>;\n protected processing: LinkedList<ProcessCallback<T>>;\n\n protected options: StackOptions;\n protected destroyed: boolean;\n\n constructor(options: StackOptions = {}) {\n this.options = { ...options };\n this.options.error =\n options.error ||\n function defaultError(err) {\n return !!err; // fail on errors\n };\n\n this.done = false;\n this.stack = [] as StackFunction<T, TReturn, TNext>[];\n this.queued = [] as ProcessCallback<T>[];\n this.processors = new LinkedList<Processor>();\n this.processing = new LinkedList<ProcessCallback<T>>();\n }\n\n isDone() {\n return this.done;\n }\n\n push(fn: StackFunction<T, TReturn, TNext>, ...rest: StackFunction<T, TReturn, TNext>[]) {\n if (this.done) return console.log('Attempting to push on a done iterator');\n this.stack.push(fn);\n !rest.length || rest.forEach((x) => this.stack.push(x));\n this._pump();\n }\n\n next(): Promise<IteratorResult<T, TReturn>> {\n return new Pinkie((resolve, reject) => {\n this._processOrQueue((err, result: IteratorResult<T, TReturn>) => {\n err ? reject(err) : resolve(result);\n });\n });\n }\n\n [Symbol.asyncIterator](): AsyncIterableIterator<T, TReturn, TNext> {\n return this;\n }\n\n forEach(fn: EachFunction<T>, options?: ForEachOptions | EachDoneCallback, callback?: EachDoneCallback): undefined | Promise<boolean> {\n if (typeof fn !== 'function') throw new Error('Missing each function');\n if (typeof options === 'function') {\n callback = options as EachDoneCallback;\n options = {};\n }\n\n if (typeof callback === 'function') {\n if (this.done) {\n callback(null, true);\n return;\n }\n options = options || {};\n const processorOptions: ProcessorOptions<T> = {\n each: fn,\n callbacks: options.callbacks || false,\n concurrency: options.concurrency || 1,\n limit: options.limit || Infinity,\n error:\n options.error ||\n function defaultError() {\n return true; // default is exit on error\n },\n total: 0,\n counter: 0,\n canProcess: () => {\n return !this.done && this.stack.length > 0 && this.queued.length < this.stack.length;\n },\n };\n\n let processor = createProcessor<T>(nextCallback<T, TReturn, TNext>(this), processorOptions, (err) => {\n if (!this.destroyed) this.processors.remove(processor);\n processor = null;\n options = null;\n const done = !this.stack.length;\n if ((err || done) && !this.done) this.end(err);\n return callback(err, this.done || done);\n });\n this.processors.push(processor);\n this._pump();\n return;\n }\n\n return new Promise((resolve, reject) =>\n this.forEach(fn, options, (err?: Error, done?: boolean) => {\n err ? reject(err) : resolve(done);\n })\n );\n }\n\n end(err?: Error) {\n if (this.done) return;\n this.done = true;\n while (this.processors.length > 0) this.processors.pop()(err || true);\n while (this.processing.length > 0) err ? this.processing.pop()(err) : this.processing.pop()(null, { done: true, value: null });\n while (this.queued.length > 0) err ? this.queued.pop()(err) : this.queued.pop()(null, { done: true, value: null });\n while (this.stack.length > 0) this.stack.pop();\n }\n destroy(err?: Error) {\n if (this.destroyed) throw new Error('Already destroyed');\n this.destroyed = true;\n this.end(err);\n }\n\n private _pump() {\n if (!this.done && this.processors.length > 0 && this.stack.length > 0 && this.stack.length > this.queued.length) this.processors.last()(false); // try to queue more\n while (this.stack.length > 0 && this.queued.length > 0) {\n this._processOrQueue(this.queued.pop());\n if (!this.done && this.processors.length > 0 && this.stack.length > 0 && this.stack.length > this.queued.length) this.processors.last()(false); // try to queue more\n }\n }\n\n private _processOrQueue(callback: ProcessCallback<T>): undefined {\n if (this.done) {\n callback(null, { done: true, value: null });\n return;\n }\n\n // nothing to process so queue\n if (this.stack.length === 0) {\n this.queued.push(callback);\n return;\n }\n\n // process next\n const next = this.stack.pop();\n this.processing.push(callback);\n next(this, (err?: Error, result?: IteratorResult<T, TReturn> | undefined): undefined => {\n this.processing.remove(callback);\n\n // done\n if (this.done)\n return callback(null, {\n done: true,\n value: null,\n });\n\n // skip error\n if (err && compat.defaultValue(this.options.error(err), true)) err = null;\n\n // handle callback\n if (err) callback(err);\n else if (!result) this._processOrQueue(callback);\n else callback(null, result);\n\n // done\n if (this.stack.length === 0 && this.processing.length === 0 && !this.done) this.end(); // end\n });\n }\n}\n"],"names":["LinkedList","StackBaseIterator","Symbol","global","asyncIterator","options","error","defaultError","err","done","stack","queued","processors","processing","isDone","push","fn","rest","console","log","length","forEach","x","_pump","next","Pinkie","resolve","reject","_processOrQueue","result","callback","Error","processorOptions","each","callbacks","concurrency","limit","Infinity","total","counter","canProcess","processor","createProcessor","nextCallback","destroyed","remove","end","Promise","pop","value","destroy","last","compat","defaultValue"],"mappings":"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"} |
+1
-13
@@ -1,4 +0,2 @@ | ||
| import type { ProcessCallback, Processor } from 'maximize-iterator'; | ||
| import type LinkedList from './LinkedList.js'; | ||
| export type { ForEachOptions, EachDoneCallback, EachFunction, NextCallback, Processor, ProcessorOptions, ProcessCallback } from 'maximize-iterator'; | ||
| export type { EachDoneCallback, EachFunction, ForEachOptions, NextCallback, ProcessCallback, Processor, ProcessorOptions } from 'maximize-iterator'; | ||
| export interface StackOptions { | ||
@@ -8,11 +6,1 @@ error?: (err: NodeJS.ErrnoException) => boolean; | ||
| export type ValueCallback<T, TReturn = unknown> = (error?: Error, value?: IteratorResult<T, TReturn> | undefined) => undefined; | ||
| export type StackFunction<T> = (iterator: AbstractIterator<T>, callback: ValueCallback<T>) => void; | ||
| export interface AbstractIterator<T> { | ||
| done: boolean; | ||
| stack: StackFunction<T>[]; | ||
| queued: ProcessCallback<T>[]; | ||
| processors: LinkedList<Processor>; | ||
| processing: LinkedList<ProcessCallback<T>>; | ||
| options: StackOptions; | ||
| end: () => undefined; | ||
| } |
+1
-13
@@ -1,4 +0,2 @@ | ||
| import type { ProcessCallback, Processor } from 'maximize-iterator'; | ||
| import type LinkedList from './LinkedList.js'; | ||
| export type { ForEachOptions, EachDoneCallback, EachFunction, NextCallback, Processor, ProcessorOptions, ProcessCallback } from 'maximize-iterator'; | ||
| export type { EachDoneCallback, EachFunction, ForEachOptions, NextCallback, ProcessCallback, Processor, ProcessorOptions } from 'maximize-iterator'; | ||
| export interface StackOptions { | ||
@@ -8,11 +6,1 @@ error?: (err: NodeJS.ErrnoException) => boolean; | ||
| export type ValueCallback<T, TReturn = unknown> = (error?: Error, value?: IteratorResult<T, TReturn> | undefined) => undefined; | ||
| export type StackFunction<T> = (iterator: AbstractIterator<T>, callback: ValueCallback<T>) => void; | ||
| export interface AbstractIterator<T> { | ||
| done: boolean; | ||
| stack: StackFunction<T>[]; | ||
| queued: ProcessCallback<T>[]; | ||
| processors: LinkedList<Processor>; | ||
| processing: LinkedList<ProcessCallback<T>>; | ||
| options: StackOptions; | ||
| end: () => undefined; | ||
| } |
| import LinkedList from './LinkedList.js'; | ||
| import type { EachDoneCallback, EachFunction, ForEachOptions, ProcessCallback, Processor, StackFunction, StackOptions } from './types.js'; | ||
| import type { EachDoneCallback, EachFunction, ForEachOptions, ProcessCallback, Processor, StackOptions, ValueCallback } from './types.js'; | ||
| export type StackFunction<T, TReturn = unknown, TNext = unknown> = (iterator: StackBaseIterator<T, TReturn, TNext>, callback: ValueCallback<T>) => void; | ||
| declare const Symbol: SymbolConstructor; | ||
| export { default as LinkedList } from './LinkedList.js'; | ||
| export type * from './types.js'; | ||
| export { default as LinkedList } from './LinkedList.js'; | ||
| export default class StackBaseIterator<T, TReturn = unknown, TNext = unknown> implements AsyncIterableIterator<T, TReturn, TNext> { | ||
| protected done: boolean; | ||
| protected stack: StackFunction<T>[]; | ||
| protected stack: StackFunction<T, TReturn, TNext>[]; | ||
| protected queued: ProcessCallback<T>[]; | ||
@@ -16,3 +17,3 @@ protected processors: LinkedList<Processor>; | ||
| isDone(): boolean; | ||
| push(fn: StackFunction<T>, ...rest: StackFunction<T>[]): void; | ||
| push(fn: StackFunction<T, TReturn, TNext>, ...rest: StackFunction<T, TReturn, TNext>[]): void; | ||
| next(): Promise<IteratorResult<T, TReturn>>; | ||
@@ -22,4 +23,5 @@ [Symbol.asyncIterator](): AsyncIterableIterator<T, TReturn, TNext>; | ||
| end(err?: Error): void; | ||
| pump(): void; | ||
| destroy(err?: Error): void; | ||
| private _pump; | ||
| private _processOrQueue; | ||
| } |
+48
-16
@@ -1,8 +0,7 @@ | ||
| import once from 'call-once-fn'; | ||
| import compat from 'async-compat'; | ||
| import nextCallback from 'iterator-next-callback'; | ||
| import { createProcessor } from 'maximize-iterator'; | ||
| import Pinkie from 'pinkie-promise'; | ||
| import LinkedList from './LinkedList.js'; | ||
| import { createProcessor } from 'maximize-iterator'; | ||
| import processOrQueue from './processOrQueue.js'; | ||
| // biome-ignore lint/suspicious/noShadowRestrictedNames: <explanation> | ||
| // biome-ignore lint/suspicious/noShadowRestrictedNames: Legacy | ||
| const Symbol = typeof global.Symbol === 'undefined' ? { | ||
@@ -20,9 +19,9 @@ asyncIterator: '@@' | ||
| !rest.length || rest.forEach((x)=>this.stack.push(x)); | ||
| this.pump(); | ||
| this._pump(); | ||
| } | ||
| next() { | ||
| return new Pinkie((resolve, reject)=>{ | ||
| processOrQueue(this, once((err, result)=>{ | ||
| this._processOrQueue((err, result)=>{ | ||
| err ? reject(err) : resolve(result); | ||
| })); | ||
| }); | ||
| }); | ||
@@ -68,3 +67,3 @@ } | ||
| this.processors.push(processor); | ||
| this.pump(); | ||
| this._pump(); | ||
| return; | ||
@@ -90,13 +89,46 @@ } | ||
| } | ||
| pump() { | ||
| destroy(err) { | ||
| if (this.destroyed) throw new Error('Already destroyed'); | ||
| this.destroyed = true; | ||
| this.end(err); | ||
| } | ||
| _pump() { | ||
| if (!this.done && this.processors.length > 0 && this.stack.length > 0 && this.stack.length > this.queued.length) this.processors.last()(false); // try to queue more | ||
| while(this.stack.length > 0 && this.queued.length > 0){ | ||
| processOrQueue(this, this.queued.pop()); | ||
| this._processOrQueue(this.queued.pop()); | ||
| if (!this.done && this.processors.length > 0 && this.stack.length > 0 && this.stack.length > this.queued.length) this.processors.last()(false); // try to queue more | ||
| } | ||
| } | ||
| destroy(err) { | ||
| if (this.destroyed) throw new Error('Already destroyed'); | ||
| this.destroyed = true; | ||
| this.end(err); | ||
| _processOrQueue(callback) { | ||
| if (this.done) { | ||
| callback(null, { | ||
| done: true, | ||
| value: null | ||
| }); | ||
| return; | ||
| } | ||
| // nothing to process so queue | ||
| if (this.stack.length === 0) { | ||
| this.queued.push(callback); | ||
| return; | ||
| } | ||
| // process next | ||
| const next = this.stack.pop(); | ||
| this.processing.push(callback); | ||
| next(this, (err, result)=>{ | ||
| this.processing.remove(callback); | ||
| // done | ||
| if (this.done) return callback(null, { | ||
| done: true, | ||
| value: null | ||
| }); | ||
| // skip error | ||
| if (err && compat.defaultValue(this.options.error(err), true)) err = null; | ||
| // handle callback | ||
| if (err) callback(err); | ||
| else if (!result) this._processOrQueue(callback); | ||
| else callback(null, result); | ||
| // done | ||
| if (this.stack.length === 0 && this.processing.length === 0 && !this.done) this.end(); // end | ||
| }); | ||
| } | ||
@@ -111,4 +143,4 @@ constructor(options = {}){ | ||
| this.done = false; | ||
| this.stack = new Array(); | ||
| this.queued = new Array(); | ||
| this.stack = []; | ||
| this.queued = []; | ||
| this.processors = new LinkedList(); | ||
@@ -115,0 +147,0 @@ this.processing = new LinkedList(); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/stack-base-iterator/src/index.ts"],"sourcesContent":["import once from 'call-once-fn';\nimport nextCallback from 'iterator-next-callback';\nimport Pinkie from 'pinkie-promise';\nimport LinkedList from './LinkedList.js';\n\nimport { createProcessor } from 'maximize-iterator';\nimport processOrQueue from './processOrQueue.js';\n\nimport type { AbstractIterator, EachDoneCallback, EachFunction, ForEachOptions, ProcessCallback, Processor, ProcessorOptions, StackFunction, StackOptions } from './types.js';\n\n// biome-ignore lint/suspicious/noShadowRestrictedNames: <explanation>\nconst Symbol: SymbolConstructor = typeof global.Symbol === 'undefined' ? ({ asyncIterator: '@@' } as unknown as SymbolConstructor) : global.Symbol;\n\nexport type * from './types.js';\nexport { default as LinkedList } from './LinkedList.js';\nexport default class StackBaseIterator<T, TReturn = unknown, TNext = unknown> implements AsyncIterableIterator<T, TReturn, TNext> {\n protected done: boolean;\n protected stack: StackFunction<T>[];\n protected queued: ProcessCallback<T>[];\n protected processors: LinkedList<Processor>;\n protected processing: LinkedList<ProcessCallback<T>>;\n\n protected options: StackOptions;\n protected destroyed: boolean;\n\n constructor(options: StackOptions = {}) {\n this.options = { ...options };\n this.options.error =\n options.error ||\n function defaultError(err) {\n return !!err; // fail on errors\n };\n\n this.done = false;\n this.stack = new Array<StackFunction<T>>();\n this.queued = new Array<ProcessCallback<T>>();\n this.processors = new LinkedList<Processor>();\n this.processing = new LinkedList<ProcessCallback<T>>();\n }\n\n isDone() {\n return this.done;\n }\n\n push(fn: StackFunction<T>, ...rest: StackFunction<T>[]) {\n if (this.done) return console.log('Attempting to push on a done iterator');\n this.stack.push(fn);\n !rest.length || rest.forEach((x) => this.stack.push(x));\n this.pump();\n }\n\n next(): Promise<IteratorResult<T, TReturn>> {\n return new Pinkie((resolve, reject) => {\n processOrQueue<T, TReturn>(\n this as unknown as AbstractIterator<T>,\n once((err, result: IteratorResult<T, TReturn>) => {\n err ? reject(err) : resolve(result);\n }) as ProcessCallback<T>\n );\n });\n }\n\n [Symbol.asyncIterator](): AsyncIterableIterator<T, TReturn, TNext> {\n return this;\n }\n\n forEach(fn: EachFunction<T>, options?: ForEachOptions | EachDoneCallback, callback?: EachDoneCallback): undefined | Promise<boolean> {\n if (typeof fn !== 'function') throw new Error('Missing each function');\n if (typeof options === 'function') {\n callback = options as EachDoneCallback;\n options = {};\n }\n\n if (typeof callback === 'function') {\n if (this.done) {\n callback(null, true);\n return;\n }\n options = options || {};\n const processorOptions: ProcessorOptions<T> = {\n each: fn,\n callbacks: options.callbacks || false,\n concurrency: options.concurrency || 1,\n limit: options.limit || Infinity,\n error:\n options.error ||\n function defaultError() {\n return true; // default is exit on error\n },\n total: 0,\n counter: 0,\n canProcess: () => {\n return !this.done && this.stack.length > 0 && this.queued.length < this.stack.length;\n },\n };\n\n let processor = createProcessor<T>(nextCallback<T, TReturn, TNext>(this), processorOptions, (err) => {\n if (!this.destroyed) this.processors.remove(processor);\n processor = null;\n options = null;\n const done = !this.stack.length;\n if ((err || done) && !this.done) this.end(err);\n return callback(err, this.done || done);\n });\n this.processors.push(processor);\n this.pump();\n return;\n }\n\n return new Promise((resolve, reject) =>\n this.forEach(fn, options, (err?: Error, done?: boolean) => {\n err ? reject(err) : resolve(done);\n })\n );\n }\n\n end(err?: Error) {\n if (this.done) return;\n this.done = true;\n while (this.processors.length > 0) this.processors.pop()(err || true);\n while (this.processing.length > 0) err ? this.processing.pop()(err) : this.processing.pop()(null, { done: true, value: null });\n while (this.queued.length > 0) err ? this.queued.pop()(err) : this.queued.pop()(null, { done: true, value: null });\n while (this.stack.length > 0) this.stack.pop();\n }\n\n pump() {\n if (!this.done && this.processors.length > 0 && this.stack.length > 0 && this.stack.length > this.queued.length) this.processors.last()(false); // try to queue more\n while (this.stack.length > 0 && this.queued.length > 0) {\n processOrQueue<T, TReturn>(this as unknown as AbstractIterator<T>, this.queued.pop());\n if (!this.done && this.processors.length > 0 && this.stack.length > 0 && this.stack.length > this.queued.length) this.processors.last()(false); // try to queue more\n }\n }\n\n destroy(err?: Error) {\n if (this.destroyed) throw new Error('Already destroyed');\n this.destroyed = true;\n this.end(err);\n }\n}\n"],"names":["once","nextCallback","Pinkie","LinkedList","createProcessor","processOrQueue","Symbol","global","asyncIterator","default","StackBaseIterator","isDone","done","push","fn","rest","console","log","stack","length","forEach","x","pump","next","resolve","reject","err","result","options","callback","Error","processorOptions","each","callbacks","concurrency","limit","Infinity","error","defaultError","total","counter","canProcess","queued","processor","destroyed","processors","remove","end","Promise","pop","processing","value","last","destroy","Array"],"mappings":"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"} | ||
| {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/stack-base-iterator/src/index.ts"],"sourcesContent":["import compat from 'async-compat';\nimport nextCallback from 'iterator-next-callback';\nimport { createProcessor } from 'maximize-iterator';\nimport Pinkie from 'pinkie-promise';\nimport LinkedList from './LinkedList.js';\n\nimport type { EachDoneCallback, EachFunction, ForEachOptions, ProcessCallback, Processor, ProcessorOptions, StackOptions, ValueCallback } from './types.js';\n\nexport type StackFunction<T, TReturn = unknown, TNext = unknown> = (iterator: StackBaseIterator<T, TReturn, TNext>, callback: ValueCallback<T>) => void;\n\n// biome-ignore lint/suspicious/noShadowRestrictedNames: Legacy\nconst Symbol: SymbolConstructor = typeof global.Symbol === 'undefined' ? ({ asyncIterator: '@@' } as unknown as SymbolConstructor) : global.Symbol;\n\nexport { default as LinkedList } from './LinkedList.js';\nexport type * from './types.js';\nexport default class StackBaseIterator<T, TReturn = unknown, TNext = unknown> implements AsyncIterableIterator<T, TReturn, TNext> {\n protected done: boolean;\n protected stack: StackFunction<T, TReturn, TNext>[];\n protected queued: ProcessCallback<T>[];\n protected processors: LinkedList<Processor>;\n protected processing: LinkedList<ProcessCallback<T>>;\n\n protected options: StackOptions;\n protected destroyed: boolean;\n\n constructor(options: StackOptions = {}) {\n this.options = { ...options };\n this.options.error =\n options.error ||\n function defaultError(err) {\n return !!err; // fail on errors\n };\n\n this.done = false;\n this.stack = [] as StackFunction<T, TReturn, TNext>[];\n this.queued = [] as ProcessCallback<T>[];\n this.processors = new LinkedList<Processor>();\n this.processing = new LinkedList<ProcessCallback<T>>();\n }\n\n isDone() {\n return this.done;\n }\n\n push(fn: StackFunction<T, TReturn, TNext>, ...rest: StackFunction<T, TReturn, TNext>[]) {\n if (this.done) return console.log('Attempting to push on a done iterator');\n this.stack.push(fn);\n !rest.length || rest.forEach((x) => this.stack.push(x));\n this._pump();\n }\n\n next(): Promise<IteratorResult<T, TReturn>> {\n return new Pinkie((resolve, reject) => {\n this._processOrQueue((err, result: IteratorResult<T, TReturn>) => {\n err ? reject(err) : resolve(result);\n });\n });\n }\n\n [Symbol.asyncIterator](): AsyncIterableIterator<T, TReturn, TNext> {\n return this;\n }\n\n forEach(fn: EachFunction<T>, options?: ForEachOptions | EachDoneCallback, callback?: EachDoneCallback): undefined | Promise<boolean> {\n if (typeof fn !== 'function') throw new Error('Missing each function');\n if (typeof options === 'function') {\n callback = options as EachDoneCallback;\n options = {};\n }\n\n if (typeof callback === 'function') {\n if (this.done) {\n callback(null, true);\n return;\n }\n options = options || {};\n const processorOptions: ProcessorOptions<T> = {\n each: fn,\n callbacks: options.callbacks || false,\n concurrency: options.concurrency || 1,\n limit: options.limit || Infinity,\n error:\n options.error ||\n function defaultError() {\n return true; // default is exit on error\n },\n total: 0,\n counter: 0,\n canProcess: () => {\n return !this.done && this.stack.length > 0 && this.queued.length < this.stack.length;\n },\n };\n\n let processor = createProcessor<T>(nextCallback<T, TReturn, TNext>(this), processorOptions, (err) => {\n if (!this.destroyed) this.processors.remove(processor);\n processor = null;\n options = null;\n const done = !this.stack.length;\n if ((err || done) && !this.done) this.end(err);\n return callback(err, this.done || done);\n });\n this.processors.push(processor);\n this._pump();\n return;\n }\n\n return new Promise((resolve, reject) =>\n this.forEach(fn, options, (err?: Error, done?: boolean) => {\n err ? reject(err) : resolve(done);\n })\n );\n }\n\n end(err?: Error) {\n if (this.done) return;\n this.done = true;\n while (this.processors.length > 0) this.processors.pop()(err || true);\n while (this.processing.length > 0) err ? this.processing.pop()(err) : this.processing.pop()(null, { done: true, value: null });\n while (this.queued.length > 0) err ? this.queued.pop()(err) : this.queued.pop()(null, { done: true, value: null });\n while (this.stack.length > 0) this.stack.pop();\n }\n destroy(err?: Error) {\n if (this.destroyed) throw new Error('Already destroyed');\n this.destroyed = true;\n this.end(err);\n }\n\n private _pump() {\n if (!this.done && this.processors.length > 0 && this.stack.length > 0 && this.stack.length > this.queued.length) this.processors.last()(false); // try to queue more\n while (this.stack.length > 0 && this.queued.length > 0) {\n this._processOrQueue(this.queued.pop());\n if (!this.done && this.processors.length > 0 && this.stack.length > 0 && this.stack.length > this.queued.length) this.processors.last()(false); // try to queue more\n }\n }\n\n private _processOrQueue(callback: ProcessCallback<T>): undefined {\n if (this.done) {\n callback(null, { done: true, value: null });\n return;\n }\n\n // nothing to process so queue\n if (this.stack.length === 0) {\n this.queued.push(callback);\n return;\n }\n\n // process next\n const next = this.stack.pop();\n this.processing.push(callback);\n next(this, (err?: Error, result?: IteratorResult<T, TReturn> | undefined): undefined => {\n this.processing.remove(callback);\n\n // done\n if (this.done)\n return callback(null, {\n done: true,\n value: null,\n });\n\n // skip error\n if (err && compat.defaultValue(this.options.error(err), true)) err = null;\n\n // handle callback\n if (err) callback(err);\n else if (!result) this._processOrQueue(callback);\n else callback(null, result);\n\n // done\n if (this.stack.length === 0 && this.processing.length === 0 && !this.done) this.end(); // end\n });\n }\n}\n"],"names":["compat","nextCallback","createProcessor","Pinkie","LinkedList","Symbol","global","asyncIterator","default","StackBaseIterator","isDone","done","push","fn","rest","console","log","stack","length","forEach","x","_pump","next","resolve","reject","_processOrQueue","err","result","options","callback","Error","processorOptions","each","callbacks","concurrency","limit","Infinity","error","defaultError","total","counter","canProcess","queued","processor","destroyed","processors","remove","end","Promise","pop","processing","value","destroy","last","defaultValue"],"mappings":"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"} |
+1
-13
@@ -1,4 +0,2 @@ | ||
| import type { ProcessCallback, Processor } from 'maximize-iterator'; | ||
| import type LinkedList from './LinkedList.js'; | ||
| export type { ForEachOptions, EachDoneCallback, EachFunction, NextCallback, Processor, ProcessorOptions, ProcessCallback } from 'maximize-iterator'; | ||
| export type { EachDoneCallback, EachFunction, ForEachOptions, NextCallback, ProcessCallback, Processor, ProcessorOptions } from 'maximize-iterator'; | ||
| export interface StackOptions { | ||
@@ -8,11 +6,1 @@ error?: (err: NodeJS.ErrnoException) => boolean; | ||
| export type ValueCallback<T, TReturn = unknown> = (error?: Error, value?: IteratorResult<T, TReturn> | undefined) => undefined; | ||
| export type StackFunction<T> = (iterator: AbstractIterator<T>, callback: ValueCallback<T>) => void; | ||
| export interface AbstractIterator<T> { | ||
| done: boolean; | ||
| stack: StackFunction<T>[]; | ||
| queued: ProcessCallback<T>[]; | ||
| processors: LinkedList<Processor>; | ||
| processing: LinkedList<ProcessCallback<T>>; | ||
| options: StackOptions; | ||
| end: () => undefined; | ||
| } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/stack-base-iterator/src/types.ts"],"sourcesContent":["import type { ProcessCallback, Processor } from 'maximize-iterator';\nimport type LinkedList from './LinkedList.js';\n\nexport type { ForEachOptions, EachDoneCallback, EachFunction, NextCallback, Processor, ProcessorOptions, ProcessCallback } from 'maximize-iterator';\nexport interface StackOptions {\n error?: (err: NodeJS.ErrnoException) => boolean;\n}\n\nexport type ValueCallback<T, TReturn = unknown> = (error?: Error, value?: IteratorResult<T, TReturn> | undefined) => undefined;\nexport type StackFunction<T> = (iterator: AbstractIterator<T>, callback: ValueCallback<T>) => void;\n\nexport interface AbstractIterator<T> {\n done: boolean;\n stack: StackFunction<T>[];\n queued: ProcessCallback<T>[];\n processors: LinkedList<Processor>;\n processing: LinkedList<ProcessCallback<T>>;\n options: StackOptions;\n end: () => undefined;\n}\n"],"names":[],"mappings":"AAWA,WAQC"} | ||
| {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/stack-base-iterator/src/types.ts"],"sourcesContent":["export type { EachDoneCallback, EachFunction, ForEachOptions, NextCallback, ProcessCallback, Processor, ProcessorOptions } from 'maximize-iterator';\nexport interface StackOptions {\n error?: (err: NodeJS.ErrnoException) => boolean;\n}\n\nexport type ValueCallback<T, TReturn = unknown> = (error?: Error, value?: IteratorResult<T, TReturn> | undefined) => undefined;\n"],"names":[],"mappings":"AAKA,WAA+H"} |
+5
-6
| { | ||
| "name": "stack-base-iterator", | ||
| "version": "2.0.0", | ||
| "version": "2.0.1", | ||
| "description": "Base iterator for values retrieved using a stack of async functions returning values", | ||
@@ -34,3 +34,3 @@ "keywords": [ | ||
| "build": "tsds build", | ||
| "format": "biome check --write --unsafe src/ test/", | ||
| "format": "biome check --write --unsafe", | ||
| "test": "tsds test:node --no-timeouts", | ||
@@ -41,6 +41,5 @@ "test:engines": "nvu engines npm test", | ||
| "dependencies": { | ||
| "async-compat": "^1.6.13", | ||
| "call-once-fn": "^1.0.18", | ||
| "iterator-next-callback": "^2.0.0", | ||
| "maximize-iterator": "^4.0.1", | ||
| "async-compat": "^1.6.14", | ||
| "iterator-next-callback": "^2.0.1", | ||
| "maximize-iterator": "^4.0.2", | ||
| "pinkie-promise": "^2.0.1" | ||
@@ -47,0 +46,0 @@ }, |
| import type { AbstractIterator, ProcessCallback } from './types.js'; | ||
| export default function processOrQueue<T, TReturn>(iterator: AbstractIterator<T>, callback: ProcessCallback<T>): undefined; |
| import type { AbstractIterator, ProcessCallback } from './types.js'; | ||
| export default function processOrQueue<T, TReturn>(iterator: AbstractIterator<T>, callback: ProcessCallback<T>): undefined; |
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { | ||
| value: true | ||
| }); | ||
| Object.defineProperty(exports, "default", { | ||
| enumerable: true, | ||
| get: function() { | ||
| return processOrQueue; | ||
| } | ||
| }); | ||
| var _asynccompat = /*#__PURE__*/ _interop_require_default(require("async-compat")); | ||
| function _interop_require_default(obj) { | ||
| return obj && obj.__esModule ? obj : { | ||
| default: obj | ||
| }; | ||
| } | ||
| function processOrQueue(iterator, callback) { | ||
| if (iterator.done) { | ||
| callback(null, { | ||
| done: true, | ||
| value: null | ||
| }); | ||
| return; | ||
| } | ||
| // nothing to process so queue | ||
| if (iterator.stack.length === 0) { | ||
| iterator.queued.push(callback); | ||
| return; | ||
| } | ||
| // process next | ||
| var next = iterator.stack.pop(); | ||
| iterator.processing.push(callback); | ||
| next(iterator, function(err, result) { | ||
| iterator.processing.remove(callback); | ||
| // done | ||
| if (iterator.done) return callback(null, { | ||
| done: true, | ||
| value: null | ||
| }); | ||
| // skip error | ||
| if (err && _asynccompat.default.defaultValue(iterator.options.error(err), true)) err = null; | ||
| // handle callback | ||
| if (err) callback(err); | ||
| else if (!result) processOrQueue(iterator, callback); | ||
| else callback(null, result); | ||
| // done | ||
| if (iterator.stack.length === 0 && iterator.processing.length === 0 && !iterator.done) iterator.end(); // end | ||
| }); | ||
| } | ||
| /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; } |
| {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/stack-base-iterator/src/processOrQueue.ts"],"sourcesContent":["import compat from 'async-compat';\n\nimport type { AbstractIterator, ProcessCallback } from './types.js';\n\nexport default function processOrQueue<T, TReturn>(iterator: AbstractIterator<T>, callback: ProcessCallback<T>): undefined {\n if (iterator.done) {\n callback(null, { done: true, value: null });\n return;\n }\n\n // nothing to process so queue\n if (iterator.stack.length === 0) {\n iterator.queued.push(callback);\n return;\n }\n\n // process next\n const next = iterator.stack.pop();\n iterator.processing.push(callback);\n next(iterator, (err?: Error, result?: IteratorResult<T, TReturn> | undefined): undefined => {\n iterator.processing.remove(callback);\n\n // done\n if (iterator.done)\n return callback(null, {\n done: true,\n value: null,\n });\n\n // skip error\n if (err && compat.defaultValue(iterator.options.error(err), true)) err = null;\n\n // handle callback\n if (err) callback(err);\n else if (!result) processOrQueue(iterator, callback);\n else callback(null, result);\n\n // done\n if (iterator.stack.length === 0 && iterator.processing.length === 0 && !iterator.done) iterator.end(); // end\n });\n}\n"],"names":["processOrQueue","iterator","callback","done","value","stack","length","queued","push","next","pop","processing","err","result","remove","compat","defaultValue","options","error","end"],"mappings":";;;;+BAIA;;;eAAwBA;;;kEAJL;;;;;;AAIJ,SAASA,eAA2BC,QAA6B,EAAEC,QAA4B;IAC5G,IAAID,SAASE,IAAI,EAAE;QACjBD,SAAS,MAAM;YAAEC,MAAM;YAAMC,OAAO;QAAK;QACzC;IACF;IAEA,8BAA8B;IAC9B,IAAIH,SAASI,KAAK,CAACC,MAAM,KAAK,GAAG;QAC/BL,SAASM,MAAM,CAACC,IAAI,CAACN;QACrB;IACF;IAEA,eAAe;IACf,IAAMO,OAAOR,SAASI,KAAK,CAACK,GAAG;IAC/BT,SAASU,UAAU,CAACH,IAAI,CAACN;IACzBO,KAAKR,UAAU,SAACW,KAAaC;QAC3BZ,SAASU,UAAU,CAACG,MAAM,CAACZ;QAE3B,OAAO;QACP,IAAID,SAASE,IAAI,EACf,OAAOD,SAAS,MAAM;YACpBC,MAAM;YACNC,OAAO;QACT;QAEF,aAAa;QACb,IAAIQ,OAAOG,oBAAM,CAACC,YAAY,CAACf,SAASgB,OAAO,CAACC,KAAK,CAACN,MAAM,OAAOA,MAAM;QAEzE,kBAAkB;QAClB,IAAIA,KAAKV,SAASU;aACb,IAAI,CAACC,QAAQb,eAAeC,UAAUC;aACtCA,SAAS,MAAMW;QAEpB,OAAO;QACP,IAAIZ,SAASI,KAAK,CAACC,MAAM,KAAK,KAAKL,SAASU,UAAU,CAACL,MAAM,KAAK,KAAK,CAACL,SAASE,IAAI,EAAEF,SAASkB,GAAG,IAAI,MAAM;IAC/G;AACF"} |
| import type { AbstractIterator, ProcessCallback } from './types.js'; | ||
| export default function processOrQueue<T, TReturn>(iterator: AbstractIterator<T>, callback: ProcessCallback<T>): undefined; |
| import compat from 'async-compat'; | ||
| export default function processOrQueue(iterator, callback) { | ||
| if (iterator.done) { | ||
| callback(null, { | ||
| done: true, | ||
| value: null | ||
| }); | ||
| return; | ||
| } | ||
| // nothing to process so queue | ||
| if (iterator.stack.length === 0) { | ||
| iterator.queued.push(callback); | ||
| return; | ||
| } | ||
| // process next | ||
| const next = iterator.stack.pop(); | ||
| iterator.processing.push(callback); | ||
| next(iterator, (err, result)=>{ | ||
| iterator.processing.remove(callback); | ||
| // done | ||
| if (iterator.done) return callback(null, { | ||
| done: true, | ||
| value: null | ||
| }); | ||
| // skip error | ||
| if (err && compat.defaultValue(iterator.options.error(err), true)) err = null; | ||
| // handle callback | ||
| if (err) callback(err); | ||
| else if (!result) processOrQueue(iterator, callback); | ||
| else callback(null, result); | ||
| // done | ||
| if (iterator.stack.length === 0 && iterator.processing.length === 0 && !iterator.done) iterator.end(); // end | ||
| }); | ||
| } |
| {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/stack-base-iterator/src/processOrQueue.ts"],"sourcesContent":["import compat from 'async-compat';\n\nimport type { AbstractIterator, ProcessCallback } from './types.js';\n\nexport default function processOrQueue<T, TReturn>(iterator: AbstractIterator<T>, callback: ProcessCallback<T>): undefined {\n if (iterator.done) {\n callback(null, { done: true, value: null });\n return;\n }\n\n // nothing to process so queue\n if (iterator.stack.length === 0) {\n iterator.queued.push(callback);\n return;\n }\n\n // process next\n const next = iterator.stack.pop();\n iterator.processing.push(callback);\n next(iterator, (err?: Error, result?: IteratorResult<T, TReturn> | undefined): undefined => {\n iterator.processing.remove(callback);\n\n // done\n if (iterator.done)\n return callback(null, {\n done: true,\n value: null,\n });\n\n // skip error\n if (err && compat.defaultValue(iterator.options.error(err), true)) err = null;\n\n // handle callback\n if (err) callback(err);\n else if (!result) processOrQueue(iterator, callback);\n else callback(null, result);\n\n // done\n if (iterator.stack.length === 0 && iterator.processing.length === 0 && !iterator.done) iterator.end(); // end\n });\n}\n"],"names":["compat","processOrQueue","iterator","callback","done","value","stack","length","queued","push","next","pop","processing","err","result","remove","defaultValue","options","error","end"],"mappings":"AAAA,OAAOA,YAAY,eAAe;AAIlC,eAAe,SAASC,eAA2BC,QAA6B,EAAEC,QAA4B;IAC5G,IAAID,SAASE,IAAI,EAAE;QACjBD,SAAS,MAAM;YAAEC,MAAM;YAAMC,OAAO;QAAK;QACzC;IACF;IAEA,8BAA8B;IAC9B,IAAIH,SAASI,KAAK,CAACC,MAAM,KAAK,GAAG;QAC/BL,SAASM,MAAM,CAACC,IAAI,CAACN;QACrB;IACF;IAEA,eAAe;IACf,MAAMO,OAAOR,SAASI,KAAK,CAACK,GAAG;IAC/BT,SAASU,UAAU,CAACH,IAAI,CAACN;IACzBO,KAAKR,UAAU,CAACW,KAAaC;QAC3BZ,SAASU,UAAU,CAACG,MAAM,CAACZ;QAE3B,OAAO;QACP,IAAID,SAASE,IAAI,EACf,OAAOD,SAAS,MAAM;YACpBC,MAAM;YACNC,OAAO;QACT;QAEF,aAAa;QACb,IAAIQ,OAAOb,OAAOgB,YAAY,CAACd,SAASe,OAAO,CAACC,KAAK,CAACL,MAAM,OAAOA,MAAM;QAEzE,kBAAkB;QAClB,IAAIA,KAAKV,SAASU;aACb,IAAI,CAACC,QAAQb,eAAeC,UAAUC;aACtCA,SAAS,MAAMW;QAEpB,OAAO;QACP,IAAIZ,SAASI,KAAK,CAACC,MAAM,KAAK,KAAKL,SAASU,UAAU,CAACL,MAAM,KAAK,KAAK,CAACL,SAASE,IAAI,EAAEF,SAASiB,GAAG,IAAI,MAAM;IAC/G;AACF"} |
4
-20%60513
-5.62%26
-21.21%599
-6.55%- Removed
- Removed
Updated
Updated