stack-base-iterator
Advanced tools
@@ -16,2 +16,4 @@ import LinkedList from './LinkedList.js'; | ||
| private flushing; | ||
| private pending; | ||
| private endScheduled; | ||
| constructor(options?: StackOptions); | ||
@@ -26,3 +28,4 @@ isDone(): boolean; | ||
| private _pump; | ||
| private _scheduleEndCheck; | ||
| private _processOrQueue; | ||
| } |
@@ -16,2 +16,4 @@ import LinkedList from './LinkedList.js'; | ||
| private flushing; | ||
| private pending; | ||
| private endScheduled; | ||
| constructor(options?: StackOptions); | ||
@@ -26,3 +28,4 @@ isDone(): boolean; | ||
| private _pump; | ||
| private _scheduleEndCheck; | ||
| private _processOrQueue; | ||
| } |
+43
-10
@@ -63,2 +63,7 @@ "use strict"; | ||
| var root = typeof window === 'undefined' ? global : window; | ||
| // Cross-platform async scheduler (Node 0.8+ compatible) | ||
| // setImmediate is preferred (Node 0.10+), falls back to setTimeout for Node 0.8 | ||
| var defer = typeof setImmediate === 'function' ? setImmediate : function(fn) { | ||
| return setTimeout(fn, 0); | ||
| }; | ||
| // biome-ignore lint/suspicious/noShadowRestrictedNames: Legacy | ||
@@ -83,2 +88,4 @@ var Symbol = typeof root.Symbol === 'undefined' ? { | ||
| this.flushing = false; | ||
| this.pending = 0; | ||
| this.endScheduled = false; | ||
| } | ||
@@ -139,9 +146,17 @@ var _proto = StackBaseIterator.prototype; | ||
| }; | ||
| var callbackFired = false; | ||
| var processor = (0, _maximizeiterator.createProcessor)((0, _iteratornextcallback.default)(this), processorOptions, function(err) { | ||
| if (!_this.destroyed) _this.processors.remove(processor); | ||
| processor = null; | ||
| options = null; | ||
| var done = !_this.stack.length; | ||
| if ((err || done) && !_this.done) _this.end(err); | ||
| return callback(err, _this.done || done); | ||
| // Guard against double callback (can happen if end() is called while microtask is pending) | ||
| if (callbackFired) return; | ||
| callbackFired = true; | ||
| // Defer completion decision AND processor removal to give deferred work a chance to push | ||
| // Processor must stay in list so _pump() can signal it to process new items | ||
| defer(function() { | ||
| if (!_this.destroyed) _this.processors.remove(processor); | ||
| processor = null; | ||
| options = null; | ||
| var done = !_this.stack.length && _this.pending === 0; | ||
| if ((err || done) && !_this.done) _this.end(err); | ||
| callback(err, _this.done || done); | ||
| }); | ||
| }); | ||
@@ -189,2 +204,15 @@ this.processors.push(processor); | ||
| }; | ||
| _proto._scheduleEndCheck = function _scheduleEndCheck() { | ||
| var _this = this; | ||
| // Defer end check to give other deferred work a chance to push | ||
| if (this.endScheduled || this.done) return; | ||
| this.endScheduled = true; | ||
| defer(function() { | ||
| _this.endScheduled = false; | ||
| // Re-check ALL conditions after deferral | ||
| if (_this.stack.length === 0 && _this.processing.length === 0 && _this.pending === 0 && !_this.done) { | ||
| _this.end(); | ||
| } | ||
| }); | ||
| }; | ||
| _proto._processOrQueue = function _processOrQueue(callback) { | ||
@@ -207,3 +235,5 @@ var _this = this; | ||
| this.processing.push(callback); | ||
| this.pending++; | ||
| next(this, function(err, result) { | ||
| _this.pending--; | ||
| _this.processing.remove(callback); | ||
@@ -221,8 +251,11 @@ // done | ||
| _this.queued.push(callback); | ||
| _pinkiepromise.default.resolve().then(function() { | ||
| defer(function() { | ||
| return _this._pump(); | ||
| }); // Added to microtask queue to start new call stack | ||
| }); // Deferred to start new call stack | ||
| } else callback(null, result); | ||
| // done | ||
| if (_this.stack.length === 0 && _this.processing.length === 0 && !_this.done) _this.end(); // end | ||
| // Only schedule end check when we might actually be done | ||
| // This prevents premature end checks from earlier items | ||
| if (_this.stack.length === 0 && _this.processing.length === 0 && _this.pending === 0) { | ||
| _this._scheduleEndCheck(); | ||
| } | ||
| }); | ||
@@ -229,0 +262,0 @@ }; |
@@ -1,1 +0,1 @@ | ||
| {"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.ts';\n\nimport type { EachDoneCallback, EachFunction, ForEachOptions, ProcessCallback, Processor, ProcessorOptions, StackOptions, ValueCallback } from './types.ts';\n\nexport type StackFunction<T, TReturn = unknown, TNext = unknown> = (iterator: StackBaseIterator<T, TReturn, TNext>, callback: ValueCallback<T>) => void;\n\nconst root = typeof window === 'undefined' ? global : window;\n// biome-ignore lint/suspicious/noShadowRestrictedNames: Legacy\nconst Symbol: SymbolConstructor = typeof root.Symbol === 'undefined' ? ({ asyncIterator: undefined } as unknown as SymbolConstructor) : root.Symbol;\n\nexport { default as LinkedList } from './LinkedList.ts';\nexport type * from './types.ts';\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 private flushing: 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 this.flushing = false;\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 ||\n rest.forEach((x) => {\n this.stack.push(x);\n });\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 // Flush loop pattern: if already flushing, the outer loop will handle new work\n // This prevents stack overflow by avoiding recursion entirely\n if (this.flushing) return;\n this.flushing = true;\n\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 this.flushing = false;\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 // queue again\n else if (!result) {\n this.queued.push(callback);\n Pinkie.resolve().then(() => this._pump()); // Added to microtask queue to start new call stack\n }\n // return the result\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","root","window","global","Symbol","asyncIterator","undefined","options","error","defaultError","err","done","stack","queued","processors","processing","flushing","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","then"],"mappings":";;;;;;;;;;;QAcoBA;eAAAA,qBAAU;;;eAETC;;;kEAhBF;2EACM;gCACO;oEACb;mEACI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMvB,IAAMC,OAAO,OAAOC,WAAW,cAAcC,SAASD;AACtD,+DAA+D;AAC/D,IAAME,SAA4B,OAAOH,KAAKG,MAAM,KAAK,cAAe;IAAEC,eAAeC;AAAU,IAAqCL,KAAKG,MAAM;AAIpI,IAAA,AAAMJ,kCAAN;;aAAMA;YAWPO,UAAAA,iEAAwB,CAAC;gCAXlBP;QAYjB,IAAI,CAACO,OAAO,GAAG,mBAAKA;QACpB,IAAI,CAACA,OAAO,CAACC,KAAK,GAChBD,QAAQC,KAAK,IACb,SAASC,aAAaC,GAAG;YACvB,OAAO,CAAC,CAACA,KAAK,iBAAiB;QACjC;QAEF,IAAI,CAACC,IAAI,GAAG;QACZ,IAAI,CAACC,KAAK,GAAG,EAAE;QACf,IAAI,CAACC,MAAM,GAAG,EAAE;QAChB,IAAI,CAACC,UAAU,GAAG,IAAIf,qBAAU;QAChC,IAAI,CAACgB,UAAU,GAAG,IAAIhB,qBAAU;QAChC,IAAI,CAACiB,QAAQ,GAAG;;iBAxBChB;IA2BnBiB,OAAAA,MAEC,GAFDA,SAAAA;QACE,OAAO,IAAI,CAACN,IAAI;IAClB;IAEAO,OAAAA,IAQC,GARDA,SAAAA,KAAKC,EAAoC;;QAAE,IAAA,IAAA,OAAA,UAAA,QAAA,AAAGC,OAAH,UAAA,OAAA,IAAA,OAAA,QAAA,OAAA,GAAA,OAAA,MAAA;YAAGA,KAAH,OAAA,KAAA,SAAA,CAAA,KAA2C;;QACpF,IAAI,IAAI,CAACT,IAAI,EAAE,OAAOU,QAAQC,GAAG,CAAC;QAClC,IAAI,CAACV,KAAK,CAACM,IAAI,CAACC;QAChB,CAACC,KAAKG,MAAM,IACVH,KAAKI,OAAO,CAAC,SAACC;YACZ,MAAKb,KAAK,CAACM,IAAI,CAACO;QAClB;QACF,IAAI,CAACC,KAAK;IACZ;IAEAC,OAAAA,IAMC,GANDA,SAAAA;;QACE,OAAO,IAAIC,sBAAM,CAAC,SAACC,SAASC;YAC1B,MAAKC,eAAe,CAAC,SAACrB,KAAKsB;gBACzBtB,MAAMoB,OAAOpB,OAAOmB,QAAQG;YAC9B;QACF;IACF;IAEA,MAAA,CAAC5B,OAAOC,aAAa,CAAC,AAErB,GAFD;QACE,OAAO,IAAI;IACb;IAEAmB,OAAAA,OAgDC,GAhDDA,SAAAA,QAAQL,EAAmB,EAAEZ,OAA2C,EAAE0B,QAA2B;;QACnG,IAAI,OAAOd,OAAO,YAAY,MAAM,IAAIe,MAAM;QAC9C,IAAI,OAAO3B,YAAY,YAAY;YACjC0B,WAAW1B;YACXA,UAAU,CAAC;QACb;QAEA,IAAI,OAAO0B,aAAa,YAAY;YAClC,IAAI,IAAI,CAACtB,IAAI,EAAE;gBACbsB,SAAS,MAAM;gBACf;YACF;YACA1B,UAAUA,WAAW,CAAC;YACtB,IAAM4B,mBAAwC;gBAC5CC,MAAMjB;gBACNkB,WAAW9B,QAAQ8B,SAAS,IAAI;gBAChCC,aAAa/B,QAAQ+B,WAAW,IAAI;gBACpCC,OAAOhC,QAAQgC,KAAK,IAAIC;gBACxBhC,OACED,QAAQC,KAAK,IACb,SAASC;oBACP,OAAO,MAAM,2BAA2B;gBAC1C;gBACFgC,OAAO;gBACPC,SAAS;gBACTC,YAAY;oBACV,OAAO,CAAC,MAAKhC,IAAI,IAAI,MAAKC,KAAK,CAACW,MAAM,GAAG,KAAK,MAAKV,MAAM,CAACU,MAAM,GAAG,MAAKX,KAAK,CAACW,MAAM;gBACtF;YACF;YAEA,IAAIqB,YAAYC,IAAAA,iCAAe,EAAIC,IAAAA,6BAAY,EAAoB,IAAI,GAAGX,kBAAkB,SAACzB;gBAC3F,IAAI,CAAC,MAAKqC,SAAS,EAAE,MAAKjC,UAAU,CAACkC,MAAM,CAACJ;gBAC5CA,YAAY;gBACZrC,UAAU;gBACV,IAAMI,OAAO,CAAC,MAAKC,KAAK,CAACW,MAAM;gBAC/B,IAAI,AAACb,CAAAA,OAAOC,IAAG,KAAM,CAAC,MAAKA,IAAI,EAAE,MAAKsC,GAAG,CAACvC;gBAC1C,OAAOuB,SAASvB,KAAK,MAAKC,IAAI,IAAIA;YACpC;YACA,IAAI,CAACG,UAAU,CAACI,IAAI,CAAC0B;YACrB,IAAI,CAAClB,KAAK;YACV;QACF;QAEA,OAAO,IAAIwB,QAAQ,SAACrB,SAASC;mBAC3B,MAAKN,OAAO,CAACL,IAAIZ,SAAS,SAACG,KAAaC;gBACtCD,MAAMoB,OAAOpB,OAAOmB,QAAQlB;YAC9B;;IAEJ;IAEAsC,OAAAA,GAOC,GAPDA,SAAAA,IAAIvC,GAAW;QACb,IAAI,IAAI,CAACC,IAAI,EAAE;QACf,IAAI,CAACA,IAAI,GAAG;QACZ,MAAO,IAAI,CAACG,UAAU,CAACS,MAAM,GAAG,EAAG,IAAI,CAACT,UAAU,CAACqC,GAAG,GAAGzC,OAAO;QAChE,MAAO,IAAI,CAACK,UAAU,CAACQ,MAAM,GAAG,EAAGb,MAAM,IAAI,CAACK,UAAU,CAACoC,GAAG,GAAGzC,OAAO,IAAI,CAACK,UAAU,CAACoC,GAAG,GAAG,MAAM;YAAExC,MAAM;YAAMyC,OAAO;QAAK;QAC5H,MAAO,IAAI,CAACvC,MAAM,CAACU,MAAM,GAAG,EAAGb,MAAM,IAAI,CAACG,MAAM,CAACsC,GAAG,GAAGzC,OAAO,IAAI,CAACG,MAAM,CAACsC,GAAG,GAAG,MAAM;YAAExC,MAAM;YAAMyC,OAAO;QAAK;QAChH,MAAO,IAAI,CAACxC,KAAK,CAACW,MAAM,GAAG,EAAG,IAAI,CAACX,KAAK,CAACuC,GAAG;IAC9C;IACAE,OAAAA,OAIC,GAJDA,SAAAA,QAAQ3C,GAAW;QACjB,IAAI,IAAI,CAACqC,SAAS,EAAE,MAAM,IAAIb,MAAM;QACpC,IAAI,CAACa,SAAS,GAAG;QACjB,IAAI,CAACE,GAAG,CAACvC;IACX;IAEA,OAAQgB,KAaP,GAbD,SAAQA;QACN,+EAA+E;QAC/E,8DAA8D;QAC9D,IAAI,IAAI,CAACV,QAAQ,EAAE;QACnB,IAAI,CAACA,QAAQ,GAAG;QAEhB,IAAI,CAAC,IAAI,CAACL,IAAI,IAAI,IAAI,CAACG,UAAU,CAACS,MAAM,GAAG,KAAK,IAAI,CAACX,KAAK,CAACW,MAAM,GAAG,KAAK,IAAI,CAACX,KAAK,CAACW,MAAM,GAAG,IAAI,CAACV,MAAM,CAACU,MAAM,EAAE,IAAI,CAACT,UAAU,CAACwC,IAAI,GAAG,QAAQ,oBAAoB;QACpK,MAAO,IAAI,CAAC1C,KAAK,CAACW,MAAM,GAAG,KAAK,IAAI,CAACV,MAAM,CAACU,MAAM,GAAG,EAAG;YACtD,IAAI,CAACQ,eAAe,CAAC,IAAI,CAAClB,MAAM,CAACsC,GAAG;YACpC,IAAI,CAAC,IAAI,CAACxC,IAAI,IAAI,IAAI,CAACG,UAAU,CAACS,MAAM,GAAG,KAAK,IAAI,CAACX,KAAK,CAACW,MAAM,GAAG,KAAK,IAAI,CAACX,KAAK,CAACW,MAAM,GAAG,IAAI,CAACV,MAAM,CAACU,MAAM,EAAE,IAAI,CAACT,UAAU,CAACwC,IAAI,GAAG,QAAQ,oBAAoB;QACtK;QAEA,IAAI,CAACtC,QAAQ,GAAG;IAClB;IAEA,OAAQe,eAyCP,GAzCD,SAAQA,gBAAgBE,QAA4B;;QAClD,IAAI,IAAI,CAACtB,IAAI,EAAE;YACbsB,SAAS,MAAM;gBAAEtB,MAAM;gBAAMyC,OAAO;YAAK;YACzC;QACF;QAEA,8BAA8B;QAC9B,IAAI,IAAI,CAACxC,KAAK,CAACW,MAAM,KAAK,GAAG;YAC3B,IAAI,CAACV,MAAM,CAACK,IAAI,CAACe;YACjB;QACF;QAEA,eAAe;QACf,IAAMN,OAAO,IAAI,CAACf,KAAK,CAACuC,GAAG;QAC3B,IAAI,CAACpC,UAAU,CAACG,IAAI,CAACe;QACrBN,KAAK,IAAI,EAAE,SAACjB,KAAasB;YACvB,MAAKjB,UAAU,CAACiC,MAAM,CAACf;YAEvB,OAAO;YACP,IAAI,MAAKtB,IAAI,EACX,OAAOsB,SAAS,MAAM;gBACpBtB,MAAM;gBACNyC,OAAO;YACT;YAEF,aAAa;YACb,IAAI1C,OAAO6C,oBAAM,CAACC,YAAY,CAAC,MAAKjD,OAAO,CAACC,KAAK,CAACE,MAAM,OAAOA,MAAM;YAErE,kBAAkB;YAClB,IAAIA,KAAKuB,SAASvB;iBAEb,IAAI,CAACsB,QAAQ;gBAChB,MAAKnB,MAAM,CAACK,IAAI,CAACe;gBACjBL,sBAAM,CAACC,OAAO,GAAG4B,IAAI,CAAC;2BAAM,MAAK/B,KAAK;oBAAK,mDAAmD;YAChG,OAEKO,SAAS,MAAMD;YAEpB,OAAO;YACP,IAAI,MAAKpB,KAAK,CAACW,MAAM,KAAK,KAAK,MAAKR,UAAU,CAACQ,MAAM,KAAK,KAAK,CAAC,MAAKZ,IAAI,EAAE,MAAKsC,GAAG,IAAI,MAAM;QAC/F;IACF;WA7KmBjD"} | ||
| {"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.ts';\n\nimport type { EachDoneCallback, EachFunction, ForEachOptions, ProcessCallback, Processor, ProcessorOptions, StackOptions, ValueCallback } from './types.ts';\n\nexport type StackFunction<T, TReturn = unknown, TNext = unknown> = (iterator: StackBaseIterator<T, TReturn, TNext>, callback: ValueCallback<T>) => void;\n\nconst root = typeof window === 'undefined' ? global : window;\n\n// Cross-platform async scheduler (Node 0.8+ compatible)\n// setImmediate is preferred (Node 0.10+), falls back to setTimeout for Node 0.8\nconst defer = typeof setImmediate === 'function' ? setImmediate : (fn: () => void) => setTimeout(fn, 0);\n// biome-ignore lint/suspicious/noShadowRestrictedNames: Legacy\nconst Symbol: SymbolConstructor = typeof root.Symbol === 'undefined' ? ({ asyncIterator: undefined } as unknown as SymbolConstructor) : root.Symbol;\n\nexport { default as LinkedList } from './LinkedList.ts';\nexport type * from './types.ts';\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 private flushing: boolean;\n private pending: number;\n private endScheduled: 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 this.flushing = false;\n this.pending = 0;\n this.endScheduled = false;\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 ||\n rest.forEach((x) => {\n this.stack.push(x);\n });\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 callbackFired = false;\n let processor = createProcessor<T>(nextCallback<T, TReturn, TNext>(this), processorOptions, (err) => {\n // Guard against double callback (can happen if end() is called while microtask is pending)\n if (callbackFired) return;\n callbackFired = true;\n\n // Defer completion decision AND processor removal to give deferred work a chance to push\n // Processor must stay in list so _pump() can signal it to process new items\n defer(() => {\n if (!this.destroyed) this.processors.remove(processor);\n processor = null;\n options = null;\n const done = !this.stack.length && this.pending === 0;\n if ((err || done) && !this.done) this.end(err);\n callback(err, this.done || done);\n });\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 // Flush loop pattern: if already flushing, the outer loop will handle new work\n // This prevents stack overflow by avoiding recursion entirely\n if (this.flushing) return;\n this.flushing = true;\n\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 this.flushing = false;\n }\n\n private _scheduleEndCheck() {\n // Defer end check to give other deferred work a chance to push\n if (this.endScheduled || this.done) return;\n this.endScheduled = true;\n\n defer(() => {\n this.endScheduled = false;\n // Re-check ALL conditions after deferral\n if (this.stack.length === 0 && this.processing.length === 0 && this.pending === 0 && !this.done) {\n this.end();\n }\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 this.pending++;\n next(this, (err?: Error, result?: IteratorResult<T, TReturn> | undefined): undefined => {\n this.pending--;\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 // queue again\n else if (!result) {\n this.queued.push(callback);\n defer(() => this._pump()); // Deferred to start new call stack\n }\n // return the result\n else callback(null, result);\n\n // Only schedule end check when we might actually be done\n // This prevents premature end checks from earlier items\n if (this.stack.length === 0 && this.processing.length === 0 && this.pending === 0) {\n this._scheduleEndCheck();\n }\n });\n }\n}\n"],"names":["LinkedList","StackBaseIterator","root","window","global","defer","setImmediate","fn","setTimeout","Symbol","asyncIterator","undefined","options","error","defaultError","err","done","stack","queued","processors","processing","flushing","pending","endScheduled","isDone","push","rest","console","log","length","forEach","x","_pump","next","Pinkie","resolve","reject","_processOrQueue","result","callback","Error","processorOptions","each","callbacks","concurrency","limit","Infinity","total","counter","canProcess","callbackFired","processor","createProcessor","nextCallback","destroyed","remove","end","Promise","pop","value","destroy","last","_scheduleEndCheck","compat","defaultValue"],"mappings":"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"} |
@@ -16,2 +16,4 @@ import LinkedList from './LinkedList.js'; | ||
| private flushing; | ||
| private pending; | ||
| private endScheduled; | ||
| constructor(options?: StackOptions); | ||
@@ -26,3 +28,4 @@ isDone(): boolean; | ||
| private _pump; | ||
| private _scheduleEndCheck; | ||
| private _processOrQueue; | ||
| } |
+39
-9
@@ -7,2 +7,5 @@ import compat from 'async-compat'; | ||
| const root = typeof window === 'undefined' ? global : window; | ||
| // Cross-platform async scheduler (Node 0.8+ compatible) | ||
| // setImmediate is preferred (Node 0.10+), falls back to setTimeout for Node 0.8 | ||
| const defer = typeof setImmediate === 'function' ? setImmediate : (fn)=>setTimeout(fn, 0); | ||
| // biome-ignore lint/suspicious/noShadowRestrictedNames: Legacy | ||
@@ -61,9 +64,17 @@ const Symbol = typeof root.Symbol === 'undefined' ? { | ||
| }; | ||
| let callbackFired = false; | ||
| let processor = createProcessor(nextCallback(this), processorOptions, (err)=>{ | ||
| if (!this.destroyed) this.processors.remove(processor); | ||
| processor = null; | ||
| options = null; | ||
| const done = !this.stack.length; | ||
| if ((err || done) && !this.done) this.end(err); | ||
| return callback(err, this.done || done); | ||
| // Guard against double callback (can happen if end() is called while microtask is pending) | ||
| if (callbackFired) return; | ||
| callbackFired = true; | ||
| // Defer completion decision AND processor removal to give deferred work a chance to push | ||
| // Processor must stay in list so _pump() can signal it to process new items | ||
| defer(()=>{ | ||
| if (!this.destroyed) this.processors.remove(processor); | ||
| processor = null; | ||
| options = null; | ||
| const done = !this.stack.length && this.pending === 0; | ||
| if ((err || done) && !this.done) this.end(err); | ||
| callback(err, this.done || done); | ||
| }); | ||
| }); | ||
@@ -109,2 +120,14 @@ this.processors.push(processor); | ||
| } | ||
| _scheduleEndCheck() { | ||
| // Defer end check to give other deferred work a chance to push | ||
| if (this.endScheduled || this.done) return; | ||
| this.endScheduled = true; | ||
| defer(()=>{ | ||
| this.endScheduled = false; | ||
| // Re-check ALL conditions after deferral | ||
| if (this.stack.length === 0 && this.processing.length === 0 && this.pending === 0 && !this.done) { | ||
| this.end(); | ||
| } | ||
| }); | ||
| } | ||
| _processOrQueue(callback) { | ||
@@ -126,3 +149,5 @@ if (this.done) { | ||
| this.processing.push(callback); | ||
| this.pending++; | ||
| next(this, (err, result)=>{ | ||
| this.pending--; | ||
| this.processing.remove(callback); | ||
@@ -140,6 +165,9 @@ // done | ||
| this.queued.push(callback); | ||
| Pinkie.resolve().then(()=>this._pump()); // Added to microtask queue to start new call stack | ||
| defer(()=>this._pump()); // Deferred to start new call stack | ||
| } else callback(null, result); | ||
| // done | ||
| if (this.stack.length === 0 && this.processing.length === 0 && !this.done) this.end(); // end | ||
| // Only schedule end check when we might actually be done | ||
| // This prevents premature end checks from earlier items | ||
| if (this.stack.length === 0 && this.processing.length === 0 && this.pending === 0) { | ||
| this._scheduleEndCheck(); | ||
| } | ||
| }); | ||
@@ -160,4 +188,6 @@ } | ||
| this.flushing = false; | ||
| this.pending = 0; | ||
| this.endScheduled = false; | ||
| } | ||
| }; | ||
| export { StackBaseIterator as default }; |
@@ -1,1 +0,1 @@ | ||
| {"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.ts';\n\nimport type { EachDoneCallback, EachFunction, ForEachOptions, ProcessCallback, Processor, ProcessorOptions, StackOptions, ValueCallback } from './types.ts';\n\nexport type StackFunction<T, TReturn = unknown, TNext = unknown> = (iterator: StackBaseIterator<T, TReturn, TNext>, callback: ValueCallback<T>) => void;\n\nconst root = typeof window === 'undefined' ? global : window;\n// biome-ignore lint/suspicious/noShadowRestrictedNames: Legacy\nconst Symbol: SymbolConstructor = typeof root.Symbol === 'undefined' ? ({ asyncIterator: undefined } as unknown as SymbolConstructor) : root.Symbol;\n\nexport { default as LinkedList } from './LinkedList.ts';\nexport type * from './types.ts';\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 private flushing: 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 this.flushing = false;\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 ||\n rest.forEach((x) => {\n this.stack.push(x);\n });\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 // Flush loop pattern: if already flushing, the outer loop will handle new work\n // This prevents stack overflow by avoiding recursion entirely\n if (this.flushing) return;\n this.flushing = true;\n\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 this.flushing = false;\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 // queue again\n else if (!result) {\n this.queued.push(callback);\n Pinkie.resolve().then(() => this._pump()); // Added to microtask queue to start new call stack\n }\n // return the result\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","root","window","global","Symbol","asyncIterator","undefined","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","flushing","last","defaultValue","then"],"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.ts';\n\nimport type { EachDoneCallback, EachFunction, ForEachOptions, ProcessCallback, Processor, ProcessorOptions, StackOptions, ValueCallback } from './types.ts';\n\nexport type StackFunction<T, TReturn = unknown, TNext = unknown> = (iterator: StackBaseIterator<T, TReturn, TNext>, callback: ValueCallback<T>) => void;\n\nconst root = typeof window === 'undefined' ? global : window;\n\n// Cross-platform async scheduler (Node 0.8+ compatible)\n// setImmediate is preferred (Node 0.10+), falls back to setTimeout for Node 0.8\nconst defer = typeof setImmediate === 'function' ? setImmediate : (fn: () => void) => setTimeout(fn, 0);\n// biome-ignore lint/suspicious/noShadowRestrictedNames: Legacy\nconst Symbol: SymbolConstructor = typeof root.Symbol === 'undefined' ? ({ asyncIterator: undefined } as unknown as SymbolConstructor) : root.Symbol;\n\nexport { default as LinkedList } from './LinkedList.ts';\nexport type * from './types.ts';\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 private flushing: boolean;\n private pending: number;\n private endScheduled: 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 this.flushing = false;\n this.pending = 0;\n this.endScheduled = false;\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 ||\n rest.forEach((x) => {\n this.stack.push(x);\n });\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 callbackFired = false;\n let processor = createProcessor<T>(nextCallback<T, TReturn, TNext>(this), processorOptions, (err) => {\n // Guard against double callback (can happen if end() is called while microtask is pending)\n if (callbackFired) return;\n callbackFired = true;\n\n // Defer completion decision AND processor removal to give deferred work a chance to push\n // Processor must stay in list so _pump() can signal it to process new items\n defer(() => {\n if (!this.destroyed) this.processors.remove(processor);\n processor = null;\n options = null;\n const done = !this.stack.length && this.pending === 0;\n if ((err || done) && !this.done) this.end(err);\n callback(err, this.done || done);\n });\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 // Flush loop pattern: if already flushing, the outer loop will handle new work\n // This prevents stack overflow by avoiding recursion entirely\n if (this.flushing) return;\n this.flushing = true;\n\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 this.flushing = false;\n }\n\n private _scheduleEndCheck() {\n // Defer end check to give other deferred work a chance to push\n if (this.endScheduled || this.done) return;\n this.endScheduled = true;\n\n defer(() => {\n this.endScheduled = false;\n // Re-check ALL conditions after deferral\n if (this.stack.length === 0 && this.processing.length === 0 && this.pending === 0 && !this.done) {\n this.end();\n }\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 this.pending++;\n next(this, (err?: Error, result?: IteratorResult<T, TReturn> | undefined): undefined => {\n this.pending--;\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 // queue again\n else if (!result) {\n this.queued.push(callback);\n defer(() => this._pump()); // Deferred to start new call stack\n }\n // return the result\n else callback(null, result);\n\n // Only schedule end check when we might actually be done\n // This prevents premature end checks from earlier items\n if (this.stack.length === 0 && this.processing.length === 0 && this.pending === 0) {\n this._scheduleEndCheck();\n }\n });\n }\n}\n"],"names":["compat","nextCallback","createProcessor","Pinkie","LinkedList","root","window","global","defer","setImmediate","fn","setTimeout","Symbol","asyncIterator","undefined","default","StackBaseIterator","isDone","done","push","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","callbackFired","processor","destroyed","processors","remove","pending","end","Promise","pop","processing","value","destroy","flushing","last","_scheduleEndCheck","endScheduled","defaultValue"],"mappings":"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"} |
+1
-1
| { | ||
| "name": "stack-base-iterator", | ||
| "version": "2.1.11", | ||
| "version": "2.1.12", | ||
| "description": "Base iterator for values retrieved using a stack of async functions returning values", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
71053
11.9%692
11.08%