diff --git a/js/com/cbl.js b/js/com/cbl.js new file mode 100644 index 0000000..42cf75f --- /dev/null +++ b/js/com/cbl.js @@ -0,0 +1,64 @@ +/** + ** ============================== + ** O O O OOOO + ** O O O O O O + ** O O O O O O + ** OOOO OOOO O OOO OOOO + ** O O O O O O O + ** O O O O O O O + ** OOOO OOOO O O OOOO + ** ============================== + ** Dr. Stefan Bosse http://www.bsslab.de + ** + ** COPYRIGHT: THIS SOFTWARE, EXECUTABLE AND SOURCE CODE IS OWNED + ** BY THE AUTHOR(S). + ** THIS SOURCE CODE MAY NOT BE COPIED, EXTRACTED, + ** MODIFIED, OR OTHERWISE USED IN A CONTEXT + ** OUTSIDE OF THE SOFTWARE SYSTEM. + ** + ** $AUTHORS: Stefan Bosse + ** $INITIAL: (C) 2006-2017 bLAB + ** $CREATED: 27-11-17 by sbosse. + ** $VERSION: 1.1.1 + ** + ** $INFO: + ** + ** JavaScript Callback List + ** + ** Assume there is a set of non-blocking IO operations with callbacks io1,io2,.., and there is a final + ** callback function that should be called after all io operations have finished. + ** + ** $ENDOFINFO + */ + +function CBL(callback) { + if (!(this instanceof CBL)) return new CBL(callback); + this.schedules=[]; + this.callback=callback; +} + +// Next schedule +CBL.prototype.next = function (status) { + var f=this.schedules.shift(); + // if (f) console.log('next '+f.toString()) + if (f) { + f(this.next.bind(this),status); + } else if (this.callback) this.callback(status); +} + +// Add next IO callback at the end of the list +CBL.prototype.push = function (f) { + this.schedules.push(f); +} + +// Execute CBL +CBL.prototype.start = function () { + this.next(); +} + +// Add next IO callback at the top of the list +CBL.prototype.top = function (f) { + this.schedules.unshift(f); +} + +module.exports=CBL;