stack-base-iterator
Advanced tools
@@ -12,3 +12,2 @@ import LinkedList from './LinkedList.js'; | ||
| protected options: StackOptions; | ||
| protected entries: LinkedList<T>; | ||
| protected destroyed: boolean; | ||
@@ -21,3 +20,4 @@ constructor(options?: StackOptions); | ||
| end(err?: Error): void; | ||
| pump(): void; | ||
| destroy(err?: Error): void; | ||
| } |
@@ -12,3 +12,2 @@ import LinkedList from './LinkedList.js'; | ||
| protected options: StackOptions; | ||
| protected entries: LinkedList<T>; | ||
| protected destroyed: boolean; | ||
@@ -21,3 +20,4 @@ constructor(options?: StackOptions); | ||
| end(err?: Error): void; | ||
| pump(): void; | ||
| destroy(err?: Error): void; | ||
| } |
+11
-6
@@ -21,4 +21,3 @@ "use strict"; | ||
| var _LinkedList = /*#__PURE__*/ _interop_require_default(require("./LinkedList.js")); | ||
| var _createProcessor = /*#__PURE__*/ _interop_require_default(require("./createProcessor.js")); | ||
| var _drainStack = /*#__PURE__*/ _interop_require_default(require("./drainStack.js")); | ||
| var _maximizeiterator = require("maximize-iterator"); | ||
| var _processOrQueue = /*#__PURE__*/ _interop_require_default(require("./processOrQueue.js")); | ||
@@ -123,3 +122,2 @@ function _array_like_to_array(arr, len) { | ||
| this.processing = new _LinkedList.default(); | ||
| this.entries = new _LinkedList.default(); | ||
| } | ||
@@ -140,3 +138,3 @@ var _proto = StackBaseIterator.prototype; | ||
| }); | ||
| (0, _drainStack.default)(this); | ||
| this.pump(); | ||
| }; | ||
@@ -192,3 +190,3 @@ _proto.next = function next() { | ||
| }; | ||
| var processor = (0, _createProcessor.default)(this.next.bind(this), processorOptions, function(err) { | ||
| var processor = (0, _maximizeiterator.createProcessor)(this.next.bind(this), processorOptions, function(err) { | ||
| if (!_this.destroyed) _this.processors.remove(processor); | ||
@@ -202,3 +200,3 @@ processor = null; | ||
| this.processors.push(processor); | ||
| processor(); | ||
| this.pump(); | ||
| return; | ||
@@ -220,2 +218,9 @@ } | ||
| }; | ||
| _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()); | ||
| 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) { | ||
@@ -222,0 +227,0 @@ if (this.destroyed) throw new Error('Already destroyed'); |
@@ -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 LinkedList from './LinkedList.js';\n\nimport createProcesor from './createProcessor.js';\nimport drainStack from './drainStack.js';\nimport processOrQueue from './processOrQueue.js';\n\nimport type { AbstractIterator, EachDoneCallback, EachFunction, ForEachOptions, NextCallback, ProcessCallback, Processor, ProcessorOptions, StackFunction, StackOptions } from './types.js';\n\nexport type * from './types.js';\nexport { default as LinkedList } from './LinkedList.js';\nexport default class StackBaseIterator<T, TReturn = unknown, TNext = unknown> implements AsyncIterator<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 entries: LinkedList<T>;\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 this.entries = new LinkedList<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 drainStack<T>(this as unknown as AbstractIterator<T>);\n }\n\n next(...[value]: [] | [TNext]): Promise<IteratorResult<T, TReturn>> {\n const callback = value as NextCallback<T>;\n if (typeof callback === 'function') {\n processOrQueue(\n this as unknown as AbstractIterator<T>,\n once((err?: Error, value?: T | null) => {\n err ? callback(err) : callback(null, value);\n }) as ProcessCallback<T>\n );\n return;\n }\n\n return new Promise((resolve, reject) => {\n processOrQueue(\n this as unknown as AbstractIterator<T>,\n once((err, value: T) => {\n err ? reject(err) : resolve({ value, done: value === null } as IteratorResult<T, TReturn>);\n }) as ProcessCallback<T>\n );\n });\n }\n\n forEach(fn: EachFunction<T>, options?: ForEachOptions | ProcessCallback<T>, 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 stop: () => {\n return this.done || this.queued.length >= this.stack.length;\n },\n };\n\n let processor = createProcesor<T>(this.next.bind(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 processor();\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, null);\n while (this.queued.length > 0) err ? this.queued.pop()(err) : this.queued.pop()(null, null);\n while (this.stack.length > 0) this.stack.pop();\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\nif (typeof Symbol !== 'undefined' && Symbol.asyncIterator) {\n StackBaseIterator.prototype[Symbol.asyncIterator] = function asyncIterator() {\n const self = this;\n return {\n next() {\n return self.next().then((value) => {\n return Promise.resolve(value);\n });\n },\n destroy() {\n self.destroy();\n return Promise.resolve();\n },\n };\n };\n}\n"],"names":["LinkedList","StackBaseIterator","options","error","defaultError","err","done","stack","Array","queued","processors","processing","entries","isDone","push","fn","rest","console","log","length","forEach","x","drainStack","next","value","callback","processOrQueue","once","Promise","resolve","reject","Error","processorOptions","each","callbacks","concurrency","limit","Infinity","total","counter","stop","processor","createProcesor","bind","destroyed","remove","end","pop","destroy","Symbol","asyncIterator","prototype","self","then"],"mappings":"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"} | ||
| {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/stack-base-iterator/src/index.ts"],"sourcesContent":["import once from 'call-once-fn';\nimport LinkedList from './LinkedList.js';\n\nimport { createProcessor } from 'maximize-iterator';\nimport processOrQueue from './processOrQueue.js';\n\nimport type { AbstractIterator, EachDoneCallback, EachFunction, ForEachOptions, NextCallback, ProcessCallback, Processor, ProcessorOptions, StackFunction, StackOptions } from './types.js';\n\nexport type * from './types.js';\nexport { default as LinkedList } from './LinkedList.js';\nexport default class StackBaseIterator<T, TReturn = unknown, TNext = unknown> implements AsyncIterator<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(...[value]: [] | [TNext]): Promise<IteratorResult<T, TReturn>> {\n const callback = value as NextCallback<T>;\n if (typeof callback === 'function') {\n processOrQueue(\n this as unknown as AbstractIterator<T>,\n once((err?: Error, value?: T | null) => {\n err ? callback(err) : callback(null, value);\n }) as ProcessCallback<T>\n );\n return;\n }\n\n return new Promise((resolve, reject) => {\n processOrQueue(\n this as unknown as AbstractIterator<T>,\n once((err, value: T) => {\n err ? reject(err) : resolve({ value, done: value === null } as IteratorResult<T, TReturn>);\n }) as ProcessCallback<T>\n );\n });\n }\n\n forEach(fn: EachFunction<T>, options?: ForEachOptions | ProcessCallback<T>, 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 stop: () => {\n return this.done || this.queued.length >= this.stack.length;\n },\n };\n\n let processor = createProcessor<T>(this.next.bind(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, null);\n while (this.queued.length > 0) err ? this.queued.pop()(err) : this.queued.pop()(null, 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(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\nif (typeof Symbol !== 'undefined' && Symbol.asyncIterator) {\n StackBaseIterator.prototype[Symbol.asyncIterator] = function asyncIterator() {\n const self = this;\n return {\n next() {\n return self.next().then((value) => {\n return Promise.resolve(value);\n });\n },\n destroy() {\n self.destroy();\n return Promise.resolve();\n },\n };\n };\n}\n"],"names":["LinkedList","StackBaseIterator","options","error","defaultError","err","done","stack","Array","queued","processors","processing","isDone","push","fn","rest","console","log","length","forEach","x","pump","next","value","callback","processOrQueue","once","Promise","resolve","reject","Error","processorOptions","each","callbacks","concurrency","limit","Infinity","total","counter","stop","processor","createProcessor","bind","destroyed","remove","end","pop","last","destroy","Symbol","asyncIterator","prototype","self","then"],"mappings":";;;;;;;;;;;QASoBA;eAAAA,mBAAU;;;eACTC;;;iEAVJ;iEACM;gCAES;qEACL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMZ,IAAA,AAAMA,kCAAN;;aAAMA;YAUPC,UAAAA,iEAAwB,CAAC;gCAVlBD;QAWjB,IAAI,CAACC,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,IAAIC;QACjB,IAAI,CAACC,MAAM,GAAG,IAAID;QAClB,IAAI,CAACE,UAAU,GAAG,IAAIV,mBAAU;QAChC,IAAI,CAACW,UAAU,GAAG,IAAIX,mBAAU;;iBAtBfC;IAyBnBW,OAAAA,MAEC,GAFDA,SAAAA;QACE,OAAO,IAAI,CAACN,IAAI;IAClB;IAEAO,OAAAA,IAKC,GALDA,SAAAA,KAAKC,EAAoB;;QAAE,IAAA,IAAA,OAAA,UAAA,QAAA,AAAGC,OAAH,UAAA,OAAA,IAAA,OAAA,QAAA,OAAA,GAAA,OAAA,MAAA;YAAGA,KAAH,OAAA,KAAA,SAAA,CAAA,KAA2B;;QACpD,IAAI,IAAI,CAACT,IAAI,EAAE,OAAOU,QAAQC,GAAG,CAAC;QAClC,IAAI,CAACV,KAAK,CAACM,IAAI,CAACC;QAChB,CAACC,KAAKG,MAAM,IAAIH,KAAKI,OAAO,CAAC,SAACC;mBAAM,MAAKb,KAAK,CAACM,IAAI,CAACO;;QACpD,IAAI,CAACC,IAAI;IACX;IAEAC,OAAAA,IAoBC,GApBDA,SAAAA;;QAAK,IAAA,IAAA,OAAA,UAAA,QAAA,OAAA,UAAA,OAAA,OAAA,GAAA,OAAA,MAAA;YAAA,KAAA,QAAA,SAAA,CAAA,KAAwB;;YAAxB,yBAAA,UAAIC,QAAJ;QACH,IAAMC,WAAWD;QACjB,IAAI,OAAOC,aAAa,YAAY;YAClCC,IAAAA,uBAAc,EACZ,IAAI,EACJC,IAAAA,mBAAI,EAAC,SAACrB,KAAakB;gBACjBlB,MAAMmB,SAASnB,OAAOmB,SAAS,MAAMD;YACvC;YAEF;QACF;QAEA,OAAO,IAAII,QAAQ,SAACC,SAASC;YAC3BJ,IAAAA,uBAAc,SAEZC,IAAAA,mBAAI,EAAC,SAACrB,KAAKkB;gBACTlB,MAAMwB,OAAOxB,OAAOuB,QAAQ;oBAAEL,OAAAA;oBAAOjB,MAAMiB,UAAU;gBAAK;YAC5D;QAEJ;IACF;IAEAJ,OAAAA,OAgDC,GAhDDA,SAAAA,QAAQL,EAAmB,EAAEZ,OAA6C,EAAEsB,QAA2B;;QACrG,IAAI,OAAOV,OAAO,YAAY,MAAM,IAAIgB,MAAM;QAC9C,IAAI,OAAO5B,YAAY,YAAY;YACjCsB,WAAWtB;YACXA,UAAU,CAAC;QACb;QAEA,IAAI,OAAOsB,aAAa,YAAY;YAClC,IAAI,IAAI,CAAClB,IAAI,EAAE;gBACbkB,SAAS,MAAM;gBACf;YACF;YACAtB,UAAUA,WAAW,CAAC;YACtB,IAAM6B,mBAAwC;gBAC5CC,MAAMlB;gBACNmB,WAAW/B,QAAQ+B,SAAS,IAAI;gBAChCC,aAAahC,QAAQgC,WAAW,IAAI;gBACpCC,OAAOjC,QAAQiC,KAAK,IAAIC;gBACxBjC,OACED,QAAQC,KAAK,IACb,SAASC;oBACP,OAAO,MAAM,2BAA2B;gBAC1C;gBACFiC,OAAO;gBACPC,SAAS;gBACTC,MAAM;oBACJ,OAAO,MAAKjC,IAAI,IAAI,MAAKG,MAAM,CAACS,MAAM,IAAI,MAAKX,KAAK,CAACW,MAAM;gBAC7D;YACF;YAEA,IAAIsB,YAAYC,IAAAA,iCAAe,EAAI,IAAI,CAACnB,IAAI,CAACoB,IAAI,CAAC,IAAI,GAAGX,kBAAkB,SAAC1B;gBAC1E,IAAI,CAAC,MAAKsC,SAAS,EAAE,MAAKjC,UAAU,CAACkC,MAAM,CAACJ;gBAC5CA,YAAY;gBACZtC,UAAU;gBACV,IAAMI,OAAO,CAAC,MAAKC,KAAK,CAACW,MAAM;gBAC/B,IAAI,AAACb,CAAAA,OAAOC,IAAG,KAAM,CAAC,MAAKA,IAAI,EAAE,MAAKuC,GAAG,CAACxC;gBAC1C,OAAOmB,SAASnB,KAAK,MAAKC,IAAI,IAAIA;YACpC;YACA,IAAI,CAACI,UAAU,CAACG,IAAI,CAAC2B;YACrB,IAAI,CAACnB,IAAI;YACT;QACF;QAEA,OAAO,IAAIM,QAAQ,SAACC,SAASC;mBAC3B,MAAKV,OAAO,CAACL,IAAIZ,SAAS,SAACG,KAAaC;gBACtCD,MAAMwB,OAAOxB,OAAOuB,QAAQtB;YAC9B;;IAEJ;IAEAuC,OAAAA,GAOC,GAPDA,SAAAA,IAAIxC,GAAW;QACb,IAAI,IAAI,CAACC,IAAI,EAAE;QACf,IAAI,CAACA,IAAI,GAAG;QACZ,MAAO,IAAI,CAACI,UAAU,CAACQ,MAAM,GAAG,EAAG,IAAI,CAACR,UAAU,CAACoC,GAAG,GAAGzC,OAAO;QAChE,MAAO,IAAI,CAACM,UAAU,CAACO,MAAM,GAAG,EAAGb,MAAM,IAAI,CAACM,UAAU,CAACmC,GAAG,GAAGzC,OAAO,IAAI,CAACM,UAAU,CAACmC,GAAG,GAAG,MAAM;QAClG,MAAO,IAAI,CAACrC,MAAM,CAACS,MAAM,GAAG,EAAGb,MAAM,IAAI,CAACI,MAAM,CAACqC,GAAG,GAAGzC,OAAO,IAAI,CAACI,MAAM,CAACqC,GAAG,GAAG,MAAM;QACtF,MAAO,IAAI,CAACvC,KAAK,CAACW,MAAM,GAAG,EAAG,IAAI,CAACX,KAAK,CAACuC,GAAG;IAC9C;IAEAzB,OAAAA,IAMC,GANDA,SAAAA;QACE,IAAI,CAAC,IAAI,CAACf,IAAI,IAAI,IAAI,CAACI,UAAU,CAACQ,MAAM,GAAG,KAAK,IAAI,CAACX,KAAK,CAACW,MAAM,GAAG,KAAK,IAAI,CAACX,KAAK,CAACW,MAAM,GAAG,IAAI,CAACT,MAAM,CAACS,MAAM,EAAE,IAAI,CAACR,UAAU,CAACqC,IAAI,GAAG,QAAQ,oBAAoB;QACpK,MAAO,IAAI,CAACxC,KAAK,CAACW,MAAM,GAAG,KAAK,IAAI,CAACT,MAAM,CAACS,MAAM,GAAG,EAAG;YACtDO,IAAAA,uBAAc,EAAC,IAAI,EAAoC,IAAI,CAAChB,MAAM,CAACqC,GAAG;YACtE,IAAI,CAAC,IAAI,CAACxC,IAAI,IAAI,IAAI,CAACI,UAAU,CAACQ,MAAM,GAAG,KAAK,IAAI,CAACX,KAAK,CAACW,MAAM,GAAG,KAAK,IAAI,CAACX,KAAK,CAACW,MAAM,GAAG,IAAI,CAACT,MAAM,CAACS,MAAM,EAAE,IAAI,CAACR,UAAU,CAACqC,IAAI,GAAG,QAAQ,oBAAoB;QACtK;IACF;IAEAC,OAAAA,OAIC,GAJDA,SAAAA,QAAQ3C,GAAW;QACjB,IAAI,IAAI,CAACsC,SAAS,EAAE,MAAM,IAAIb,MAAM;QACpC,IAAI,CAACa,SAAS,GAAG;QACjB,IAAI,CAACE,GAAG,CAACxC;IACX;WAjImBJ;;AAoIrB,IAAI,OAAOgD,WAAW,eAAeA,OAAOC,aAAa,EAAE;IACzDjD,kBAAkBkD,SAAS,CAACF,OAAOC,aAAa,CAAC,GAAG,SAASA;QAC3D,IAAME,OAAO,IAAI;QACjB,OAAO;YACL9B,MAAAA,SAAAA;gBACE,OAAO8B,KAAK9B,IAAI,GAAG+B,IAAI,CAAC,SAAC9B;oBACvB,OAAOI,QAAQC,OAAO,CAACL;gBACzB;YACF;YACAyB,SAAAA,SAAAA;gBACEI,KAAKJ,OAAO;gBACZ,OAAOrB,QAAQC,OAAO;YACxB;QACF;IACF;AACF"} |
@@ -24,3 +24,3 @@ "use strict"; | ||
| // nothing to process so queue | ||
| if (!iterator.stack.length) { | ||
| if (iterator.stack.length === 0) { | ||
| iterator.queued.push(callback); | ||
@@ -38,3 +38,3 @@ return; | ||
| if (err && _asynccompat.default.defaultValue(iterator.options.error(err), true)) err = null; // skip error | ||
| var done = iterator.stack.length <= 0 && iterator.processing.length <= 0; | ||
| var done = iterator.stack.length === 0 && iterator.processing.length === 0; | ||
| !done && !err && !result ? processOrQueue(iterator, callback) : callback(err, result || null); | ||
@@ -41,0 +41,0 @@ if (done && !iterator.done) iterator.end(); // end |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/stack-base-iterator/src/processOrQueue.ts"],"sourcesContent":["import compat from 'async-compat';\n\nimport asap from 'asap';\n\nimport type { AbstractIterator, ProcessCallback } from './types.js';\n\nexport default function processOrQueue<T>(iterator: AbstractIterator<T>, callback: ProcessCallback<T>): undefined {\n if (iterator.done) {\n callback(null, null);\n return;\n }\n\n // nothing to process so queue\n if (!iterator.stack.length) {\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?: T): undefined => {\n // break call stack\n asap(() => {\n iterator.processing.remove(callback);\n if (iterator.done) return callback(null, null); // early exit\n if (err && compat.defaultValue(iterator.options.error(err), true)) err = null; // skip error\n\n const done = iterator.stack.length <= 0 && iterator.processing.length <= 0;\n !done && !err && !result ? processOrQueue<T>(iterator, callback) : callback(err, result || null);\n if (done && !iterator.done) iterator.end(); // end\n });\n });\n}\n"],"names":["processOrQueue","iterator","callback","done","stack","length","queued","push","next","pop","processing","err","result","asap","remove","compat","defaultValue","options","error","end"],"mappings":";;;;+BAMA;;;eAAwBA;;;kEANL;2DAEF;;;;;;AAIF,SAASA,eAAkBC,QAA6B,EAAEC,QAA4B;IACnG,IAAID,SAASE,IAAI,EAAE;QACjBD,SAAS,MAAM;QACf;IACF;IAEA,8BAA8B;IAC9B,IAAI,CAACD,SAASG,KAAK,CAACC,MAAM,EAAE;QAC1BJ,SAASK,MAAM,CAACC,IAAI,CAACL;QACrB;IACF;IAEA,eAAe;IACf,IAAMM,OAAOP,SAASG,KAAK,CAACK,GAAG;IAC/BR,SAASS,UAAU,CAACH,IAAI,CAACL;IACzBM,KAAKP,UAAU,SAACU,KAAaC;QAC3B,mBAAmB;QACnBC,IAAAA,aAAI,EAAC;YACHZ,SAASS,UAAU,CAACI,MAAM,CAACZ;YAC3B,IAAID,SAASE,IAAI,EAAE,OAAOD,SAAS,MAAM,OAAO,aAAa;YAC7D,IAAIS,OAAOI,oBAAM,CAACC,YAAY,CAACf,SAASgB,OAAO,CAACC,KAAK,CAACP,MAAM,OAAOA,MAAM,MAAM,aAAa;YAE5F,IAAMR,OAAOF,SAASG,KAAK,CAACC,MAAM,IAAI,KAAKJ,SAASS,UAAU,CAACL,MAAM,IAAI;YACzE,CAACF,QAAQ,CAACQ,OAAO,CAACC,SAASZ,eAAkBC,UAAUC,YAAYA,SAASS,KAAKC,UAAU;YAC3F,IAAIT,QAAQ,CAACF,SAASE,IAAI,EAAEF,SAASkB,GAAG,IAAI,MAAM;QACpD;IACF;AACF"} | ||
| {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/stack-base-iterator/src/processOrQueue.ts"],"sourcesContent":["import compat from 'async-compat';\n\nimport asap from 'asap';\n\nimport type { AbstractIterator, ProcessCallback } from './types.js';\n\nexport default function processOrQueue<T>(iterator: AbstractIterator<T>, callback: ProcessCallback<T>): undefined {\n if (iterator.done) {\n callback(null, 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?: T): undefined => {\n // break call stack\n asap(() => {\n iterator.processing.remove(callback);\n if (iterator.done) return callback(null, null); // early exit\n if (err && compat.defaultValue(iterator.options.error(err), true)) err = null; // skip error\n\n const done = iterator.stack.length === 0 && iterator.processing.length === 0;\n !done && !err && !result ? processOrQueue<T>(iterator, callback) : callback(err, result || null);\n if (done && !iterator.done) iterator.end(); // end\n });\n });\n}\n"],"names":["processOrQueue","iterator","callback","done","stack","length","queued","push","next","pop","processing","err","result","asap","remove","compat","defaultValue","options","error","end"],"mappings":";;;;+BAMA;;;eAAwBA;;;kEANL;2DAEF;;;;;;AAIF,SAASA,eAAkBC,QAA6B,EAAEC,QAA4B;IACnG,IAAID,SAASE,IAAI,EAAE;QACjBD,SAAS,MAAM;QACf;IACF;IAEA,8BAA8B;IAC9B,IAAID,SAASG,KAAK,CAACC,MAAM,KAAK,GAAG;QAC/BJ,SAASK,MAAM,CAACC,IAAI,CAACL;QACrB;IACF;IAEA,eAAe;IACf,IAAMM,OAAOP,SAASG,KAAK,CAACK,GAAG;IAC/BR,SAASS,UAAU,CAACH,IAAI,CAACL;IACzBM,KAAKP,UAAU,SAACU,KAAaC;QAC3B,mBAAmB;QACnBC,IAAAA,aAAI,EAAC;YACHZ,SAASS,UAAU,CAACI,MAAM,CAACZ;YAC3B,IAAID,SAASE,IAAI,EAAE,OAAOD,SAAS,MAAM,OAAO,aAAa;YAC7D,IAAIS,OAAOI,oBAAM,CAACC,YAAY,CAACf,SAASgB,OAAO,CAACC,KAAK,CAACP,MAAM,OAAOA,MAAM,MAAM,aAAa;YAE5F,IAAMR,OAAOF,SAASG,KAAK,CAACC,MAAM,KAAK,KAAKJ,SAASS,UAAU,CAACL,MAAM,KAAK;YAC3E,CAACF,QAAQ,CAACQ,OAAO,CAACC,SAASZ,eAAkBC,UAAUC,YAAYA,SAASS,KAAKC,UAAU;YAC3F,IAAIT,QAAQ,CAACF,SAASE,IAAI,EAAEF,SAASkB,GAAG,IAAI,MAAM;QACpD;IACF;AACF"} |
+3
-23
@@ -0,28 +1,8 @@ | ||
| import type { ProcessCallback, Processor } from 'maximize-iterator'; | ||
| import type LinkedList from './LinkedList.js'; | ||
| export type ProcessCallback<T> = (error?: Error, value?: T | null) => undefined; | ||
| export type NextCallback<T> = (error?: Error, value?: T | null) => undefined; | ||
| export type Processor = (doneOrError?: Error | boolean) => undefined; | ||
| export type EachDoneCallback = (error?: Error, value?: boolean) => undefined; | ||
| export type EachCallback<T> = (value: T, callback: EachDoneCallback) => undefined; | ||
| export type EachPromise<T> = (value: T) => Promise<boolean | undefined>; | ||
| export type EachFunction<T> = EachCallback<T> | EachPromise<T>; | ||
| export type ValueCallback<T> = (error?: Error, value?: T) => boolean; | ||
| export type Next<T> = (callback: ProcessCallback<T>) => undefined; | ||
| export type { ForEachOptions, EachDoneCallback, EachFunction, NextCallback, Processor, ProcessorOptions, ProcessCallback } from 'maximize-iterator'; | ||
| export interface StackOptions { | ||
| error?: (err: NodeJS.ErrnoException) => boolean; | ||
| } | ||
| export interface ForEachOptions { | ||
| error?: (err: NodeJS.ErrnoException) => boolean; | ||
| callbacks?: boolean; | ||
| concurrency?: number; | ||
| limit?: number; | ||
| } | ||
| export interface ProcessorOptions<T> extends ForEachOptions { | ||
| each: EachFunction<T>; | ||
| counter: number; | ||
| total: number; | ||
| stop: (count?: number) => boolean; | ||
| done?: boolean; | ||
| err?: Error; | ||
| } | ||
| export type ValueCallback<T> = (error?: Error, value?: T) => boolean; | ||
| export type StackFunction<T> = (iterator: AbstractIterator<T>, callback: ValueCallback<T>) => void; | ||
@@ -29,0 +9,0 @@ export interface AbstractIterator<T> { |
+3
-23
@@ -0,28 +1,8 @@ | ||
| import type { ProcessCallback, Processor } from 'maximize-iterator'; | ||
| import type LinkedList from './LinkedList.js'; | ||
| export type ProcessCallback<T> = (error?: Error, value?: T | null) => undefined; | ||
| export type NextCallback<T> = (error?: Error, value?: T | null) => undefined; | ||
| export type Processor = (doneOrError?: Error | boolean) => undefined; | ||
| export type EachDoneCallback = (error?: Error, value?: boolean) => undefined; | ||
| export type EachCallback<T> = (value: T, callback: EachDoneCallback) => undefined; | ||
| export type EachPromise<T> = (value: T) => Promise<boolean | undefined>; | ||
| export type EachFunction<T> = EachCallback<T> | EachPromise<T>; | ||
| export type ValueCallback<T> = (error?: Error, value?: T) => boolean; | ||
| export type Next<T> = (callback: ProcessCallback<T>) => undefined; | ||
| export type { ForEachOptions, EachDoneCallback, EachFunction, NextCallback, Processor, ProcessorOptions, ProcessCallback } from 'maximize-iterator'; | ||
| export interface StackOptions { | ||
| error?: (err: NodeJS.ErrnoException) => boolean; | ||
| } | ||
| export interface ForEachOptions { | ||
| error?: (err: NodeJS.ErrnoException) => boolean; | ||
| callbacks?: boolean; | ||
| concurrency?: number; | ||
| limit?: number; | ||
| } | ||
| export interface ProcessorOptions<T> extends ForEachOptions { | ||
| each: EachFunction<T>; | ||
| counter: number; | ||
| total: number; | ||
| stop: (count?: number) => boolean; | ||
| done?: boolean; | ||
| err?: Error; | ||
| } | ||
| export type ValueCallback<T> = (error?: Error, value?: T) => boolean; | ||
| export type StackFunction<T> = (iterator: AbstractIterator<T>, callback: ValueCallback<T>) => void; | ||
@@ -29,0 +9,0 @@ export interface AbstractIterator<T> { |
@@ -12,3 +12,2 @@ import LinkedList from './LinkedList.js'; | ||
| protected options: StackOptions; | ||
| protected entries: LinkedList<T>; | ||
| protected destroyed: boolean; | ||
@@ -21,3 +20,4 @@ constructor(options?: StackOptions); | ||
| end(err?: Error): void; | ||
| pump(): void; | ||
| destroy(err?: Error): void; | ||
| } |
+11
-6
| import once from 'call-once-fn'; | ||
| import LinkedList from './LinkedList.js'; | ||
| import createProcesor from './createProcessor.js'; | ||
| import drainStack from './drainStack.js'; | ||
| import { createProcessor } from 'maximize-iterator'; | ||
| import processOrQueue from './processOrQueue.js'; | ||
@@ -15,3 +14,3 @@ export { default as LinkedList } from './LinkedList.js'; | ||
| !rest.length || rest.forEach((x)=>this.stack.push(x)); | ||
| drainStack(this); | ||
| this.pump(); | ||
| } | ||
@@ -61,3 +60,3 @@ next(...[value]) { | ||
| }; | ||
| let processor = createProcesor(this.next.bind(this), processorOptions, (err)=>{ | ||
| let processor = createProcessor(this.next.bind(this), processorOptions, (err)=>{ | ||
| if (!this.destroyed) this.processors.remove(processor); | ||
@@ -71,3 +70,3 @@ processor = null; | ||
| this.processors.push(processor); | ||
| processor(); | ||
| this.pump(); | ||
| return; | ||
@@ -87,2 +86,9 @@ } | ||
| } | ||
| 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()); | ||
| 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) { | ||
@@ -105,3 +111,2 @@ if (this.destroyed) throw new Error('Already destroyed'); | ||
| this.processing = new LinkedList(); | ||
| this.entries = new LinkedList(); | ||
| } | ||
@@ -108,0 +113,0 @@ }; |
@@ -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 LinkedList from './LinkedList.js';\n\nimport createProcesor from './createProcessor.js';\nimport drainStack from './drainStack.js';\nimport processOrQueue from './processOrQueue.js';\n\nimport type { AbstractIterator, EachDoneCallback, EachFunction, ForEachOptions, NextCallback, ProcessCallback, Processor, ProcessorOptions, StackFunction, StackOptions } from './types.js';\n\nexport type * from './types.js';\nexport { default as LinkedList } from './LinkedList.js';\nexport default class StackBaseIterator<T, TReturn = unknown, TNext = unknown> implements AsyncIterator<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 entries: LinkedList<T>;\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 this.entries = new LinkedList<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 drainStack<T>(this as unknown as AbstractIterator<T>);\n }\n\n next(...[value]: [] | [TNext]): Promise<IteratorResult<T, TReturn>> {\n const callback = value as NextCallback<T>;\n if (typeof callback === 'function') {\n processOrQueue(\n this as unknown as AbstractIterator<T>,\n once((err?: Error, value?: T | null) => {\n err ? callback(err) : callback(null, value);\n }) as ProcessCallback<T>\n );\n return;\n }\n\n return new Promise((resolve, reject) => {\n processOrQueue(\n this as unknown as AbstractIterator<T>,\n once((err, value: T) => {\n err ? reject(err) : resolve({ value, done: value === null } as IteratorResult<T, TReturn>);\n }) as ProcessCallback<T>\n );\n });\n }\n\n forEach(fn: EachFunction<T>, options?: ForEachOptions | ProcessCallback<T>, 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 stop: () => {\n return this.done || this.queued.length >= this.stack.length;\n },\n };\n\n let processor = createProcesor<T>(this.next.bind(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 processor();\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, null);\n while (this.queued.length > 0) err ? this.queued.pop()(err) : this.queued.pop()(null, null);\n while (this.stack.length > 0) this.stack.pop();\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\nif (typeof Symbol !== 'undefined' && Symbol.asyncIterator) {\n StackBaseIterator.prototype[Symbol.asyncIterator] = function asyncIterator() {\n const self = this;\n return {\n next() {\n return self.next().then((value) => {\n return Promise.resolve(value);\n });\n },\n destroy() {\n self.destroy();\n return Promise.resolve();\n },\n };\n };\n}\n"],"names":["once","LinkedList","createProcesor","drainStack","processOrQueue","default","StackBaseIterator","isDone","done","push","fn","rest","console","log","stack","length","forEach","x","next","value","callback","err","Promise","resolve","reject","options","Error","processorOptions","each","callbacks","concurrency","limit","Infinity","error","defaultError","total","counter","stop","queued","processor","bind","destroyed","processors","remove","end","pop","processing","destroy","Array","entries","Symbol","asyncIterator","prototype","self","then"],"mappings":"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"} | ||
| {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/stack-base-iterator/src/index.ts"],"sourcesContent":["import once from 'call-once-fn';\nimport LinkedList from './LinkedList.js';\n\nimport { createProcessor } from 'maximize-iterator';\nimport processOrQueue from './processOrQueue.js';\n\nimport type { AbstractIterator, EachDoneCallback, EachFunction, ForEachOptions, NextCallback, ProcessCallback, Processor, ProcessorOptions, StackFunction, StackOptions } from './types.js';\n\nexport type * from './types.js';\nexport { default as LinkedList } from './LinkedList.js';\nexport default class StackBaseIterator<T, TReturn = unknown, TNext = unknown> implements AsyncIterator<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(...[value]: [] | [TNext]): Promise<IteratorResult<T, TReturn>> {\n const callback = value as NextCallback<T>;\n if (typeof callback === 'function') {\n processOrQueue(\n this as unknown as AbstractIterator<T>,\n once((err?: Error, value?: T | null) => {\n err ? callback(err) : callback(null, value);\n }) as ProcessCallback<T>\n );\n return;\n }\n\n return new Promise((resolve, reject) => {\n processOrQueue(\n this as unknown as AbstractIterator<T>,\n once((err, value: T) => {\n err ? reject(err) : resolve({ value, done: value === null } as IteratorResult<T, TReturn>);\n }) as ProcessCallback<T>\n );\n });\n }\n\n forEach(fn: EachFunction<T>, options?: ForEachOptions | ProcessCallback<T>, 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 stop: () => {\n return this.done || this.queued.length >= this.stack.length;\n },\n };\n\n let processor = createProcessor<T>(this.next.bind(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, null);\n while (this.queued.length > 0) err ? this.queued.pop()(err) : this.queued.pop()(null, 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(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\nif (typeof Symbol !== 'undefined' && Symbol.asyncIterator) {\n StackBaseIterator.prototype[Symbol.asyncIterator] = function asyncIterator() {\n const self = this;\n return {\n next() {\n return self.next().then((value) => {\n return Promise.resolve(value);\n });\n },\n destroy() {\n self.destroy();\n return Promise.resolve();\n },\n };\n };\n}\n"],"names":["once","LinkedList","createProcessor","processOrQueue","default","StackBaseIterator","isDone","done","push","fn","rest","console","log","stack","length","forEach","x","pump","next","value","callback","err","Promise","resolve","reject","options","Error","processorOptions","each","callbacks","concurrency","limit","Infinity","error","defaultError","total","counter","stop","queued","processor","bind","destroyed","processors","remove","end","pop","processing","last","destroy","Array","Symbol","asyncIterator","prototype","self","then"],"mappings":"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"} |
@@ -9,3 +9,3 @@ import compat from 'async-compat'; | ||
| // nothing to process so queue | ||
| if (!iterator.stack.length) { | ||
| if (iterator.stack.length === 0) { | ||
| iterator.queued.push(callback); | ||
@@ -23,3 +23,3 @@ return; | ||
| if (err && compat.defaultValue(iterator.options.error(err), true)) err = null; // skip error | ||
| const done = iterator.stack.length <= 0 && iterator.processing.length <= 0; | ||
| const done = iterator.stack.length === 0 && iterator.processing.length === 0; | ||
| !done && !err && !result ? processOrQueue(iterator, callback) : callback(err, result || null); | ||
@@ -26,0 +26,0 @@ if (done && !iterator.done) iterator.end(); // end |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/stack-base-iterator/src/processOrQueue.ts"],"sourcesContent":["import compat from 'async-compat';\n\nimport asap from 'asap';\n\nimport type { AbstractIterator, ProcessCallback } from './types.js';\n\nexport default function processOrQueue<T>(iterator: AbstractIterator<T>, callback: ProcessCallback<T>): undefined {\n if (iterator.done) {\n callback(null, null);\n return;\n }\n\n // nothing to process so queue\n if (!iterator.stack.length) {\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?: T): undefined => {\n // break call stack\n asap(() => {\n iterator.processing.remove(callback);\n if (iterator.done) return callback(null, null); // early exit\n if (err && compat.defaultValue(iterator.options.error(err), true)) err = null; // skip error\n\n const done = iterator.stack.length <= 0 && iterator.processing.length <= 0;\n !done && !err && !result ? processOrQueue<T>(iterator, callback) : callback(err, result || null);\n if (done && !iterator.done) iterator.end(); // end\n });\n });\n}\n"],"names":["compat","asap","processOrQueue","iterator","callback","done","stack","length","queued","push","next","pop","processing","err","result","remove","defaultValue","options","error","end"],"mappings":"AAAA,OAAOA,YAAY,eAAe;AAElC,OAAOC,UAAU,OAAO;AAIxB,eAAe,SAASC,eAAkBC,QAA6B,EAAEC,QAA4B;IACnG,IAAID,SAASE,IAAI,EAAE;QACjBD,SAAS,MAAM;QACf;IACF;IAEA,8BAA8B;IAC9B,IAAI,CAACD,SAASG,KAAK,CAACC,MAAM,EAAE;QAC1BJ,SAASK,MAAM,CAACC,IAAI,CAACL;QACrB;IACF;IAEA,eAAe;IACf,MAAMM,OAAOP,SAASG,KAAK,CAACK,GAAG;IAC/BR,SAASS,UAAU,CAACH,IAAI,CAACL;IACzBM,KAAKP,UAAU,CAACU,KAAaC;QAC3B,mBAAmB;QACnBb,KAAK;YACHE,SAASS,UAAU,CAACG,MAAM,CAACX;YAC3B,IAAID,SAASE,IAAI,EAAE,OAAOD,SAAS,MAAM,OAAO,aAAa;YAC7D,IAAIS,OAAOb,OAAOgB,YAAY,CAACb,SAASc,OAAO,CAACC,KAAK,CAACL,MAAM,OAAOA,MAAM,MAAM,aAAa;YAE5F,MAAMR,OAAOF,SAASG,KAAK,CAACC,MAAM,IAAI,KAAKJ,SAASS,UAAU,CAACL,MAAM,IAAI;YACzE,CAACF,QAAQ,CAACQ,OAAO,CAACC,SAASZ,eAAkBC,UAAUC,YAAYA,SAASS,KAAKC,UAAU;YAC3F,IAAIT,QAAQ,CAACF,SAASE,IAAI,EAAEF,SAASgB,GAAG,IAAI,MAAM;QACpD;IACF;AACF"} | ||
| {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/stack-base-iterator/src/processOrQueue.ts"],"sourcesContent":["import compat from 'async-compat';\n\nimport asap from 'asap';\n\nimport type { AbstractIterator, ProcessCallback } from './types.js';\n\nexport default function processOrQueue<T>(iterator: AbstractIterator<T>, callback: ProcessCallback<T>): undefined {\n if (iterator.done) {\n callback(null, 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?: T): undefined => {\n // break call stack\n asap(() => {\n iterator.processing.remove(callback);\n if (iterator.done) return callback(null, null); // early exit\n if (err && compat.defaultValue(iterator.options.error(err), true)) err = null; // skip error\n\n const done = iterator.stack.length === 0 && iterator.processing.length === 0;\n !done && !err && !result ? processOrQueue<T>(iterator, callback) : callback(err, result || null);\n if (done && !iterator.done) iterator.end(); // end\n });\n });\n}\n"],"names":["compat","asap","processOrQueue","iterator","callback","done","stack","length","queued","push","next","pop","processing","err","result","remove","defaultValue","options","error","end"],"mappings":"AAAA,OAAOA,YAAY,eAAe;AAElC,OAAOC,UAAU,OAAO;AAIxB,eAAe,SAASC,eAAkBC,QAA6B,EAAEC,QAA4B;IACnG,IAAID,SAASE,IAAI,EAAE;QACjBD,SAAS,MAAM;QACf;IACF;IAEA,8BAA8B;IAC9B,IAAID,SAASG,KAAK,CAACC,MAAM,KAAK,GAAG;QAC/BJ,SAASK,MAAM,CAACC,IAAI,CAACL;QACrB;IACF;IAEA,eAAe;IACf,MAAMM,OAAOP,SAASG,KAAK,CAACK,GAAG;IAC/BR,SAASS,UAAU,CAACH,IAAI,CAACL;IACzBM,KAAKP,UAAU,CAACU,KAAaC;QAC3B,mBAAmB;QACnBb,KAAK;YACHE,SAASS,UAAU,CAACG,MAAM,CAACX;YAC3B,IAAID,SAASE,IAAI,EAAE,OAAOD,SAAS,MAAM,OAAO,aAAa;YAC7D,IAAIS,OAAOb,OAAOgB,YAAY,CAACb,SAASc,OAAO,CAACC,KAAK,CAACL,MAAM,OAAOA,MAAM,MAAM,aAAa;YAE5F,MAAMR,OAAOF,SAASG,KAAK,CAACC,MAAM,KAAK,KAAKJ,SAASS,UAAU,CAACL,MAAM,KAAK;YAC3E,CAACF,QAAQ,CAACQ,OAAO,CAACC,SAASZ,eAAkBC,UAAUC,YAAYA,SAASS,KAAKC,UAAU;YAC3F,IAAIT,QAAQ,CAACF,SAASE,IAAI,EAAEF,SAASgB,GAAG,IAAI,MAAM;QACpD;IACF;AACF"} |
+3
-23
@@ -0,28 +1,8 @@ | ||
| import type { ProcessCallback, Processor } from 'maximize-iterator'; | ||
| import type LinkedList from './LinkedList.js'; | ||
| export type ProcessCallback<T> = (error?: Error, value?: T | null) => undefined; | ||
| export type NextCallback<T> = (error?: Error, value?: T | null) => undefined; | ||
| export type Processor = (doneOrError?: Error | boolean) => undefined; | ||
| export type EachDoneCallback = (error?: Error, value?: boolean) => undefined; | ||
| export type EachCallback<T> = (value: T, callback: EachDoneCallback) => undefined; | ||
| export type EachPromise<T> = (value: T) => Promise<boolean | undefined>; | ||
| export type EachFunction<T> = EachCallback<T> | EachPromise<T>; | ||
| export type ValueCallback<T> = (error?: Error, value?: T) => boolean; | ||
| export type Next<T> = (callback: ProcessCallback<T>) => undefined; | ||
| export type { ForEachOptions, EachDoneCallback, EachFunction, NextCallback, Processor, ProcessorOptions, ProcessCallback } from 'maximize-iterator'; | ||
| export interface StackOptions { | ||
| error?: (err: NodeJS.ErrnoException) => boolean; | ||
| } | ||
| export interface ForEachOptions { | ||
| error?: (err: NodeJS.ErrnoException) => boolean; | ||
| callbacks?: boolean; | ||
| concurrency?: number; | ||
| limit?: number; | ||
| } | ||
| export interface ProcessorOptions<T> extends ForEachOptions { | ||
| each: EachFunction<T>; | ||
| counter: number; | ||
| total: number; | ||
| stop: (count?: number) => boolean; | ||
| done?: boolean; | ||
| err?: Error; | ||
| } | ||
| export type ValueCallback<T> = (error?: Error, value?: T) => boolean; | ||
| export type StackFunction<T> = (iterator: AbstractIterator<T>, callback: ValueCallback<T>) => void; | ||
@@ -29,0 +9,0 @@ export interface AbstractIterator<T> { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/stack-base-iterator/src/types.ts"],"sourcesContent":["import type LinkedList from './LinkedList.js';\n\nexport type ProcessCallback<T> = (error?: Error, value?: T | null) => undefined;\nexport type NextCallback<T> = (error?: Error, value?: T | null) => undefined;\nexport type Processor = (doneOrError?: Error | boolean) => undefined;\n\nexport type EachDoneCallback = (error?: Error, value?: boolean) => undefined;\nexport type EachCallback<T> = (value: T, callback: EachDoneCallback) => undefined;\nexport type EachPromise<T> = (value: T) => Promise<boolean | undefined>;\nexport type EachFunction<T> = EachCallback<T> | EachPromise<T>;\n\nexport type ValueCallback<T> = (error?: Error, value?: T) => boolean;\nexport type Next<T> = (callback: ProcessCallback<T>) => undefined;\n\nexport interface StackOptions {\n error?: (err: NodeJS.ErrnoException) => boolean;\n}\n\nexport interface ForEachOptions {\n error?: (err: NodeJS.ErrnoException) => boolean;\n callbacks?: boolean;\n concurrency?: number;\n limit?: number;\n}\n\nexport interface ProcessorOptions<T> extends ForEachOptions {\n each: EachFunction<T>;\n counter: number;\n total: number;\n stop: (count?: number) => boolean;\n done?: boolean;\n err?: Error;\n}\n\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":"AAoCA,WAQC"} | ||
| {"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> = (error?: Error, value?: T) => boolean;\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"} |
+3
-2
| { | ||
| "name": "stack-base-iterator", | ||
| "version": "1.2.26", | ||
| "version": "1.2.27", | ||
| "description": "Base iterator for values retrieved using a stack of async functions returning values", | ||
@@ -42,3 +42,4 @@ "keywords": [ | ||
| "async-compat": "^1.6.13", | ||
| "call-once-fn": "^1.0.18" | ||
| "call-once-fn": "^1.0.18", | ||
| "maximize-iterator": "^3.3.21" | ||
| }, | ||
@@ -45,0 +46,0 @@ "devDependencies": { |
| import type { EachDoneCallback, Next, Processor, ProcessorOptions } from './types.js'; | ||
| export default function createProcessor<T>(next: Next<T>, options: ProcessorOptions<T>, callback: EachDoneCallback): Processor; |
| import type { EachDoneCallback, Next, Processor, ProcessorOptions } from './types.js'; | ||
| export default function createProcessor<T>(next: Next<T>, options: ProcessorOptions<T>, callback: EachDoneCallback): Processor; |
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { | ||
| value: true | ||
| }); | ||
| Object.defineProperty(exports, "default", { | ||
| enumerable: true, | ||
| get: function() { | ||
| return createProcessor; | ||
| } | ||
| }); | ||
| var _asynccompat = /*#__PURE__*/ _interop_require_default(require("async-compat")); | ||
| function _interop_require_default(obj) { | ||
| return obj && obj.__esModule ? obj : { | ||
| default: obj | ||
| }; | ||
| } | ||
| var isError = function(err) { | ||
| return err && err.stack !== undefined && err.message !== undefined; | ||
| }; | ||
| function processDone(err, options, callback) { | ||
| // mark this iteration done | ||
| options.err = options.err || err; | ||
| options.done = true; | ||
| // process done | ||
| if (!options.done || options.counter > 0) return false; | ||
| callback(options.err, options.done); | ||
| return true; | ||
| } | ||
| function processResult(err, keep, options, callback) { | ||
| options.counter--; | ||
| // mark this iteration done | ||
| if (err && _asynccompat.default.defaultValue(options.error(err), false) || !err && !_asynccompat.default.defaultValue(keep, true)) { | ||
| options.err = options.err || err; | ||
| options.done = true; | ||
| } | ||
| // process done | ||
| if (!options.done || options.counter > 0) return false; | ||
| callback(options.err, options.done); | ||
| return true; | ||
| } | ||
| function createProcessor(next, options, callback) { | ||
| var isProcessing = false; | ||
| return function processor(doneOrError) { | ||
| var error = doneOrError; | ||
| if (doneOrError && processDone(isError(error) ? error : null, options, callback)) return; | ||
| if (isProcessing) return; | ||
| isProcessing = true; | ||
| var counter = 0; | ||
| while(options.counter < options.concurrency){ | ||
| if (options.done || options.stop(counter++)) break; | ||
| if (options.total >= options.limit) { | ||
| processDone(null, options, callback); | ||
| return; | ||
| } | ||
| options.total++; | ||
| options.counter++; | ||
| next(function(err, value) { | ||
| if (err || value === null) { | ||
| return !processResult(err, false, options, callback) && !isProcessing ? processor() : undefined; | ||
| } | ||
| _asynccompat.default.asyncFunction(options.each, options.callbacks, value, function(err, keep) { | ||
| return !processResult(err, keep, options, callback) && !isProcessing ? processor() : undefined; | ||
| }); | ||
| }); | ||
| } | ||
| isProcessing = false; | ||
| }; | ||
| } | ||
| /* 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/createProcessor.ts"],"sourcesContent":["import compat from 'async-compat';\n\nimport type { EachDoneCallback, Next, Processor, ProcessorOptions } from './types.js';\n\nconst isError = (err?: Error): boolean => err && err.stack !== undefined && err.message !== undefined;\n\nfunction processDone<T>(err: Error, options: ProcessorOptions<T>, callback: EachDoneCallback) {\n // mark this iteration done\n options.err = options.err || err;\n options.done = true;\n\n // process done\n if (!options.done || options.counter > 0) return false;\n callback(options.err, options.done);\n return true;\n}\n\nfunction processResult(err, keep, options, callback) {\n options.counter--;\n\n // mark this iteration done\n if ((err && compat.defaultValue(options.error(err), false)) || (!err && !compat.defaultValue(keep, true))) {\n options.err = options.err || err;\n options.done = true;\n }\n\n // process done\n if (!options.done || options.counter > 0) return false;\n callback(options.err, options.done);\n return true;\n}\n\nexport default function createProcessor<T>(next: Next<T>, options: ProcessorOptions<T>, callback: EachDoneCallback): Processor {\n let isProcessing = false;\n return function processor(doneOrError?: Error | boolean): undefined {\n const error = doneOrError as Error;\n if (doneOrError && processDone(isError(error) ? error : null, options, callback)) return;\n if (isProcessing) return;\n isProcessing = true;\n\n let counter = 0;\n while (options.counter < options.concurrency) {\n if (options.done || options.stop(counter++)) break;\n if (options.total >= options.limit) {\n processDone(null, options, callback);\n return;\n }\n options.total++;\n options.counter++;\n\n next((err?: Error, value?: unknown) => {\n if (err || value === null) {\n return !processResult(err, false, options, callback) && !isProcessing ? processor() : undefined;\n }\n compat.asyncFunction(options.each, options.callbacks, value, (err, keep) => (!processResult(err, keep, options, callback) && !isProcessing ? processor() : undefined));\n });\n }\n\n isProcessing = false;\n };\n}\n"],"names":["createProcessor","isError","err","stack","undefined","message","processDone","options","callback","done","counter","processResult","keep","compat","defaultValue","error","next","isProcessing","processor","doneOrError","concurrency","stop","total","limit","value","asyncFunction","each","callbacks"],"mappings":";;;;+BAgCA;;;eAAwBA;;;kEAhCL;;;;;;AAInB,IAAMC,UAAU,SAACC;WAAyBA,OAAOA,IAAIC,KAAK,KAAKC,aAAaF,IAAIG,OAAO,KAAKD;;AAE5F,SAASE,YAAeJ,GAAU,EAAEK,OAA4B,EAAEC,QAA0B;IAC1F,2BAA2B;IAC3BD,QAAQL,GAAG,GAAGK,QAAQL,GAAG,IAAIA;IAC7BK,QAAQE,IAAI,GAAG;IAEf,eAAe;IACf,IAAI,CAACF,QAAQE,IAAI,IAAIF,QAAQG,OAAO,GAAG,GAAG,OAAO;IACjDF,SAASD,QAAQL,GAAG,EAAEK,QAAQE,IAAI;IAClC,OAAO;AACT;AAEA,SAASE,cAAcT,GAAG,EAAEU,IAAI,EAAEL,OAAO,EAAEC,QAAQ;IACjDD,QAAQG,OAAO;IAEf,2BAA2B;IAC3B,IAAI,AAACR,OAAOW,oBAAM,CAACC,YAAY,CAACP,QAAQQ,KAAK,CAACb,MAAM,UAAY,CAACA,OAAO,CAACW,oBAAM,CAACC,YAAY,CAACF,MAAM,OAAQ;QACzGL,QAAQL,GAAG,GAAGK,QAAQL,GAAG,IAAIA;QAC7BK,QAAQE,IAAI,GAAG;IACjB;IAEA,eAAe;IACf,IAAI,CAACF,QAAQE,IAAI,IAAIF,QAAQG,OAAO,GAAG,GAAG,OAAO;IACjDF,SAASD,QAAQL,GAAG,EAAEK,QAAQE,IAAI;IAClC,OAAO;AACT;AAEe,SAAST,gBAAmBgB,IAAa,EAAET,OAA4B,EAAEC,QAA0B;IAChH,IAAIS,eAAe;IACnB,OAAO,SAASC,UAAUC,WAA6B;QACrD,IAAMJ,QAAQI;QACd,IAAIA,eAAeb,YAAYL,QAAQc,SAASA,QAAQ,MAAMR,SAASC,WAAW;QAClF,IAAIS,cAAc;QAClBA,eAAe;QAEf,IAAIP,UAAU;QACd,MAAOH,QAAQG,OAAO,GAAGH,QAAQa,WAAW,CAAE;YAC5C,IAAIb,QAAQE,IAAI,IAAIF,QAAQc,IAAI,CAACX,YAAY;YAC7C,IAAIH,QAAQe,KAAK,IAAIf,QAAQgB,KAAK,EAAE;gBAClCjB,YAAY,MAAMC,SAASC;gBAC3B;YACF;YACAD,QAAQe,KAAK;YACbf,QAAQG,OAAO;YAEfM,KAAK,SAACd,KAAasB;gBACjB,IAAItB,OAAOsB,UAAU,MAAM;oBACzB,OAAO,CAACb,cAAcT,KAAK,OAAOK,SAASC,aAAa,CAACS,eAAeC,cAAcd;gBACxF;gBACAS,oBAAM,CAACY,aAAa,CAAClB,QAAQmB,IAAI,EAAEnB,QAAQoB,SAAS,EAAEH,OAAO,SAACtB,KAAKU;2BAAU,CAACD,cAAcT,KAAKU,MAAML,SAASC,aAAa,CAACS,eAAeC,cAAcd;;YAC7J;QACF;QAEAa,eAAe;IACjB;AACF"} |
| import type { AbstractIterator } from './types.js'; | ||
| export default function drainStack<T>(iterator: AbstractIterator<T>): undefined; |
| import type { AbstractIterator } from './types.js'; | ||
| export default function drainStack<T>(iterator: AbstractIterator<T>): undefined; |
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { | ||
| value: true | ||
| }); | ||
| Object.defineProperty(exports, "default", { | ||
| enumerable: true, | ||
| get: function() { | ||
| return drainStack; | ||
| } | ||
| }); | ||
| var _processOrQueue = /*#__PURE__*/ _interop_require_default(require("./processOrQueue.js")); | ||
| function _interop_require_default(obj) { | ||
| return obj && obj.__esModule ? obj : { | ||
| default: obj | ||
| }; | ||
| } | ||
| function canProcess(iterator) { | ||
| if (iterator.done || !iterator.stack.length) return false; | ||
| if (iterator.queued.length) return true; | ||
| if (iterator.processors.length <= 0) return false; | ||
| iterator.processors.last()(false); | ||
| if (iterator.done) return false; | ||
| return iterator.queued.length > 0; | ||
| } | ||
| function drainStack(iterator) { | ||
| while(canProcess(iterator)){ | ||
| (0, _processOrQueue.default)(iterator, iterator.queued.pop()); | ||
| } | ||
| } | ||
| /* 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/drainStack.ts"],"sourcesContent":["import processOrQueue from './processOrQueue.js';\n\nimport type { AbstractIterator } from './types.js';\n\nfunction canProcess<T>(iterator: AbstractIterator<T>): boolean {\n if (iterator.done || !iterator.stack.length) return false;\n if (iterator.queued.length) return true;\n if (iterator.processors.length <= 0) return false;\n iterator.processors.last()(false);\n if (iterator.done) return false;\n return iterator.queued.length > 0;\n}\n\nexport default function drainStack<T>(iterator: AbstractIterator<T>): undefined {\n while (canProcess<T>(iterator)) {\n processOrQueue(iterator, iterator.queued.pop());\n }\n}\n"],"names":["drainStack","canProcess","iterator","done","stack","length","queued","processors","last","processOrQueue","pop"],"mappings":";;;;+BAaA;;;eAAwBA;;;qEAbG;;;;;;AAI3B,SAASC,WAAcC,QAA6B;IAClD,IAAIA,SAASC,IAAI,IAAI,CAACD,SAASE,KAAK,CAACC,MAAM,EAAE,OAAO;IACpD,IAAIH,SAASI,MAAM,CAACD,MAAM,EAAE,OAAO;IACnC,IAAIH,SAASK,UAAU,CAACF,MAAM,IAAI,GAAG,OAAO;IAC5CH,SAASK,UAAU,CAACC,IAAI,GAAG;IAC3B,IAAIN,SAASC,IAAI,EAAE,OAAO;IAC1B,OAAOD,SAASI,MAAM,CAACD,MAAM,GAAG;AAClC;AAEe,SAASL,WAAcE,QAA6B;IACjE,MAAOD,WAAcC,UAAW;QAC9BO,IAAAA,uBAAc,EAACP,UAAUA,SAASI,MAAM,CAACI,GAAG;IAC9C;AACF"} |
| import type { EachDoneCallback, Next, Processor, ProcessorOptions } from './types.js'; | ||
| export default function createProcessor<T>(next: Next<T>, options: ProcessorOptions<T>, callback: EachDoneCallback): Processor; |
| import compat from 'async-compat'; | ||
| const isError = (err)=>err && err.stack !== undefined && err.message !== undefined; | ||
| function processDone(err, options, callback) { | ||
| // mark this iteration done | ||
| options.err = options.err || err; | ||
| options.done = true; | ||
| // process done | ||
| if (!options.done || options.counter > 0) return false; | ||
| callback(options.err, options.done); | ||
| return true; | ||
| } | ||
| function processResult(err, keep, options, callback) { | ||
| options.counter--; | ||
| // mark this iteration done | ||
| if (err && compat.defaultValue(options.error(err), false) || !err && !compat.defaultValue(keep, true)) { | ||
| options.err = options.err || err; | ||
| options.done = true; | ||
| } | ||
| // process done | ||
| if (!options.done || options.counter > 0) return false; | ||
| callback(options.err, options.done); | ||
| return true; | ||
| } | ||
| export default function createProcessor(next, options, callback) { | ||
| let isProcessing = false; | ||
| return function processor(doneOrError) { | ||
| const error = doneOrError; | ||
| if (doneOrError && processDone(isError(error) ? error : null, options, callback)) return; | ||
| if (isProcessing) return; | ||
| isProcessing = true; | ||
| let counter = 0; | ||
| while(options.counter < options.concurrency){ | ||
| if (options.done || options.stop(counter++)) break; | ||
| if (options.total >= options.limit) { | ||
| processDone(null, options, callback); | ||
| return; | ||
| } | ||
| options.total++; | ||
| options.counter++; | ||
| next((err, value)=>{ | ||
| if (err || value === null) { | ||
| return !processResult(err, false, options, callback) && !isProcessing ? processor() : undefined; | ||
| } | ||
| compat.asyncFunction(options.each, options.callbacks, value, (err, keep)=>!processResult(err, keep, options, callback) && !isProcessing ? processor() : undefined); | ||
| }); | ||
| } | ||
| isProcessing = false; | ||
| }; | ||
| } |
| {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/stack-base-iterator/src/createProcessor.ts"],"sourcesContent":["import compat from 'async-compat';\n\nimport type { EachDoneCallback, Next, Processor, ProcessorOptions } from './types.js';\n\nconst isError = (err?: Error): boolean => err && err.stack !== undefined && err.message !== undefined;\n\nfunction processDone<T>(err: Error, options: ProcessorOptions<T>, callback: EachDoneCallback) {\n // mark this iteration done\n options.err = options.err || err;\n options.done = true;\n\n // process done\n if (!options.done || options.counter > 0) return false;\n callback(options.err, options.done);\n return true;\n}\n\nfunction processResult(err, keep, options, callback) {\n options.counter--;\n\n // mark this iteration done\n if ((err && compat.defaultValue(options.error(err), false)) || (!err && !compat.defaultValue(keep, true))) {\n options.err = options.err || err;\n options.done = true;\n }\n\n // process done\n if (!options.done || options.counter > 0) return false;\n callback(options.err, options.done);\n return true;\n}\n\nexport default function createProcessor<T>(next: Next<T>, options: ProcessorOptions<T>, callback: EachDoneCallback): Processor {\n let isProcessing = false;\n return function processor(doneOrError?: Error | boolean): undefined {\n const error = doneOrError as Error;\n if (doneOrError && processDone(isError(error) ? error : null, options, callback)) return;\n if (isProcessing) return;\n isProcessing = true;\n\n let counter = 0;\n while (options.counter < options.concurrency) {\n if (options.done || options.stop(counter++)) break;\n if (options.total >= options.limit) {\n processDone(null, options, callback);\n return;\n }\n options.total++;\n options.counter++;\n\n next((err?: Error, value?: unknown) => {\n if (err || value === null) {\n return !processResult(err, false, options, callback) && !isProcessing ? processor() : undefined;\n }\n compat.asyncFunction(options.each, options.callbacks, value, (err, keep) => (!processResult(err, keep, options, callback) && !isProcessing ? processor() : undefined));\n });\n }\n\n isProcessing = false;\n };\n}\n"],"names":["compat","isError","err","stack","undefined","message","processDone","options","callback","done","counter","processResult","keep","defaultValue","error","createProcessor","next","isProcessing","processor","doneOrError","concurrency","stop","total","limit","value","asyncFunction","each","callbacks"],"mappings":"AAAA,OAAOA,YAAY,eAAe;AAIlC,MAAMC,UAAU,CAACC,MAAyBA,OAAOA,IAAIC,KAAK,KAAKC,aAAaF,IAAIG,OAAO,KAAKD;AAE5F,SAASE,YAAeJ,GAAU,EAAEK,OAA4B,EAAEC,QAA0B;IAC1F,2BAA2B;IAC3BD,QAAQL,GAAG,GAAGK,QAAQL,GAAG,IAAIA;IAC7BK,QAAQE,IAAI,GAAG;IAEf,eAAe;IACf,IAAI,CAACF,QAAQE,IAAI,IAAIF,QAAQG,OAAO,GAAG,GAAG,OAAO;IACjDF,SAASD,QAAQL,GAAG,EAAEK,QAAQE,IAAI;IAClC,OAAO;AACT;AAEA,SAASE,cAAcT,GAAG,EAAEU,IAAI,EAAEL,OAAO,EAAEC,QAAQ;IACjDD,QAAQG,OAAO;IAEf,2BAA2B;IAC3B,IAAI,AAACR,OAAOF,OAAOa,YAAY,CAACN,QAAQO,KAAK,CAACZ,MAAM,UAAY,CAACA,OAAO,CAACF,OAAOa,YAAY,CAACD,MAAM,OAAQ;QACzGL,QAAQL,GAAG,GAAGK,QAAQL,GAAG,IAAIA;QAC7BK,QAAQE,IAAI,GAAG;IACjB;IAEA,eAAe;IACf,IAAI,CAACF,QAAQE,IAAI,IAAIF,QAAQG,OAAO,GAAG,GAAG,OAAO;IACjDF,SAASD,QAAQL,GAAG,EAAEK,QAAQE,IAAI;IAClC,OAAO;AACT;AAEA,eAAe,SAASM,gBAAmBC,IAAa,EAAET,OAA4B,EAAEC,QAA0B;IAChH,IAAIS,eAAe;IACnB,OAAO,SAASC,UAAUC,WAA6B;QACrD,MAAML,QAAQK;QACd,IAAIA,eAAeb,YAAYL,QAAQa,SAASA,QAAQ,MAAMP,SAASC,WAAW;QAClF,IAAIS,cAAc;QAClBA,eAAe;QAEf,IAAIP,UAAU;QACd,MAAOH,QAAQG,OAAO,GAAGH,QAAQa,WAAW,CAAE;YAC5C,IAAIb,QAAQE,IAAI,IAAIF,QAAQc,IAAI,CAACX,YAAY;YAC7C,IAAIH,QAAQe,KAAK,IAAIf,QAAQgB,KAAK,EAAE;gBAClCjB,YAAY,MAAMC,SAASC;gBAC3B;YACF;YACAD,QAAQe,KAAK;YACbf,QAAQG,OAAO;YAEfM,KAAK,CAACd,KAAasB;gBACjB,IAAItB,OAAOsB,UAAU,MAAM;oBACzB,OAAO,CAACb,cAAcT,KAAK,OAAOK,SAASC,aAAa,CAACS,eAAeC,cAAcd;gBACxF;gBACAJ,OAAOyB,aAAa,CAAClB,QAAQmB,IAAI,EAAEnB,QAAQoB,SAAS,EAAEH,OAAO,CAACtB,KAAKU,OAAU,CAACD,cAAcT,KAAKU,MAAML,SAASC,aAAa,CAACS,eAAeC,cAAcd;YAC7J;QACF;QAEAa,eAAe;IACjB;AACF"} |
| import type { AbstractIterator } from './types.js'; | ||
| export default function drainStack<T>(iterator: AbstractIterator<T>): undefined; |
| import processOrQueue from './processOrQueue.js'; | ||
| function canProcess(iterator) { | ||
| if (iterator.done || !iterator.stack.length) return false; | ||
| if (iterator.queued.length) return true; | ||
| if (iterator.processors.length <= 0) return false; | ||
| iterator.processors.last()(false); | ||
| if (iterator.done) return false; | ||
| return iterator.queued.length > 0; | ||
| } | ||
| export default function drainStack(iterator) { | ||
| while(canProcess(iterator)){ | ||
| processOrQueue(iterator, iterator.queued.pop()); | ||
| } | ||
| } |
| {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/stack-base-iterator/src/drainStack.ts"],"sourcesContent":["import processOrQueue from './processOrQueue.js';\n\nimport type { AbstractIterator } from './types.js';\n\nfunction canProcess<T>(iterator: AbstractIterator<T>): boolean {\n if (iterator.done || !iterator.stack.length) return false;\n if (iterator.queued.length) return true;\n if (iterator.processors.length <= 0) return false;\n iterator.processors.last()(false);\n if (iterator.done) return false;\n return iterator.queued.length > 0;\n}\n\nexport default function drainStack<T>(iterator: AbstractIterator<T>): undefined {\n while (canProcess<T>(iterator)) {\n processOrQueue(iterator, iterator.queued.pop());\n }\n}\n"],"names":["processOrQueue","canProcess","iterator","done","stack","length","queued","processors","last","drainStack","pop"],"mappings":"AAAA,OAAOA,oBAAoB,sBAAsB;AAIjD,SAASC,WAAcC,QAA6B;IAClD,IAAIA,SAASC,IAAI,IAAI,CAACD,SAASE,KAAK,CAACC,MAAM,EAAE,OAAO;IACpD,IAAIH,SAASI,MAAM,CAACD,MAAM,EAAE,OAAO;IACnC,IAAIH,SAASK,UAAU,CAACF,MAAM,IAAI,GAAG,OAAO;IAC5CH,SAASK,UAAU,CAACC,IAAI,GAAG;IAC3B,IAAIN,SAASC,IAAI,EAAE,OAAO;IAC1B,OAAOD,SAASI,MAAM,CAACD,MAAM,GAAG;AAClC;AAEA,eAAe,SAASI,WAAcP,QAA6B;IACjE,MAAOD,WAAcC,UAAW;QAC9BF,eAAeE,UAAUA,SAASI,MAAM,CAACI,GAAG;IAC9C;AACF"} |
67136
-21.68%4
33.33%33
-29.79%695
-22.17%+ Added
+ Added
+ Added