{"version":3,"file":"queue.mjs","sources":["../../../../../../node_modules/epubjs/src/utils/queue.js"],"sourcesContent":["import {defer, requestAnimationFrame} from \"./core\";\n\n/**\n * Queue for handling tasks one at a time\n * @class\n * @param {scope} context what this will resolve to in the tasks\n */\nclass Queue {\n\tconstructor(context){\n\t\tthis._q = [];\n\t\tthis.context = context;\n\t\tthis.tick = requestAnimationFrame;\n\t\tthis.running = false;\n\t\tthis.paused = false;\n\t}\n\n\t/**\n\t * Add an item to the queue\n\t * @return {Promise}\n\t */\n\tenqueue() {\n\t\tvar deferred, promise;\n\t\tvar queued;\n\t\tvar task = [].shift.call(arguments);\n\t\tvar args = arguments;\n\n\t\t// Handle single args without context\n\t\t// if(args && !Array.isArray(args)) {\n\t\t//   args = [args];\n\t\t// }\n\t\tif(!task) {\n\t\t\tthrow new Error(\"No Task Provided\");\n\t\t}\n\n\t\tif(typeof task === \"function\"){\n\n\t\t\tdeferred = new defer();\n\t\t\tpromise = deferred.promise;\n\n\t\t\tqueued = {\n\t\t\t\t\"task\" : task,\n\t\t\t\t\"args\"     : args,\n\t\t\t\t//\"context\"  : context,\n\t\t\t\t\"deferred\" : deferred,\n\t\t\t\t\"promise\" : promise\n\t\t\t};\n\n\t\t} else {\n\t\t\t// Task is a promise\n\t\t\tqueued = {\n\t\t\t\t\"promise\" : task\n\t\t\t};\n\n\t\t}\n\n\t\tthis._q.push(queued);\n\n\t\t// Wait to start queue flush\n\t\tif (this.paused == false && !this.running) {\n\t\t\t// setTimeout(this.flush.bind(this), 0);\n\t\t\t// this.tick.call(window, this.run.bind(this));\n\t\t\tthis.run();\n\t\t}\n\n\t\treturn queued.promise;\n\t}\n\n\t/**\n\t * Run one item\n\t * @return {Promise}\n\t */\n\tdequeue(){\n\t\tvar inwait, task, result;\n\n\t\tif(this._q.length && !this.paused) {\n\t\t\tinwait = this._q.shift();\n\t\t\ttask = inwait.task;\n\t\t\tif(task){\n\t\t\t\t// console.log(task)\n\n\t\t\t\tresult = task.apply(this.context, inwait.args);\n\n\t\t\t\tif(result && typeof result[\"then\"] === \"function\") {\n\t\t\t\t\t// Task is a function that returns a promise\n\t\t\t\t\treturn result.then(function(){\n\t\t\t\t\t\tinwait.deferred.resolve.apply(this.context, arguments);\n\t\t\t\t\t}.bind(this), function() {\n\t\t\t\t\t\tinwait.deferred.reject.apply(this.context, arguments);\n\t\t\t\t\t}.bind(this));\n\t\t\t\t} else {\n\t\t\t\t\t// Task resolves immediately\n\t\t\t\t\tinwait.deferred.resolve.apply(this.context, result);\n\t\t\t\t\treturn inwait.promise;\n\t\t\t\t}\n\n\n\n\t\t\t} else if(inwait.promise) {\n\t\t\t\t// Task is a promise\n\t\t\t\treturn inwait.promise;\n\t\t\t}\n\n\t\t} else {\n\t\t\tinwait = new defer();\n\t\t\tinwait.deferred.resolve();\n\t\t\treturn inwait.promise;\n\t\t}\n\n\t}\n\n\t// Run All Immediately\n\tdump(){\n\t\twhile(this._q.length) {\n\t\t\tthis.dequeue();\n\t\t}\n\t}\n\n\t/**\n\t * Run all tasks sequentially, at convince\n\t * @return {Promise}\n\t */\n\trun(){\n\n\t\tif(!this.running){\n\t\t\tthis.running = true;\n\t\t\tthis.defered = new defer();\n\t\t}\n\n\t\tthis.tick.call(window, () => {\n\n\t\t\tif(this._q.length) {\n\n\t\t\t\tthis.dequeue()\n\t\t\t\t\t.then(function(){\n\t\t\t\t\t\tthis.run();\n\t\t\t\t\t}.bind(this));\n\n\t\t\t} else {\n\t\t\t\tthis.defered.resolve();\n\t\t\t\tthis.running = undefined;\n\t\t\t}\n\n\t\t});\n\n\t\t// Unpause\n\t\tif(this.paused == true) {\n\t\t\tthis.paused = false;\n\t\t}\n\n\t\treturn this.defered.promise;\n\t}\n\n\t/**\n\t * Flush all, as quickly as possible\n\t * @return {Promise}\n\t */\n\tflush(){\n\n\t\tif(this.running){\n\t\t\treturn this.running;\n\t\t}\n\n\t\tif(this._q.length) {\n\t\t\tthis.running = this.dequeue()\n\t\t\t\t.then(function(){\n\t\t\t\t\tthis.running = undefined;\n\t\t\t\t\treturn this.flush();\n\t\t\t\t}.bind(this));\n\n\t\t\treturn this.running;\n\t\t}\n\n\t}\n\n\t/**\n\t * Clear all items in wait\n\t */\n\tclear(){\n\t\tthis._q = [];\n\t}\n\n\t/**\n\t * Get the number of tasks in the queue\n\t * @return {number} tasks\n\t */\n\tlength(){\n\t\treturn this._q.length;\n\t}\n\n\t/**\n\t * Pause a running queue\n\t */\n\tpause(){\n\t\tthis.paused = true;\n\t}\n\n\t/**\n\t * End the queue\n\t */\n\tstop(){\n\t\tthis._q = [];\n\t\tthis.running = false;\n\t\tthis.paused = true;\n\t}\n}\n\n\n/**\n * Create a new task from a callback\n * @class\n * @private\n * @param {function} task\n * @param {array} args\n * @param {scope} context\n * @return {function} task\n */\nclass Task {\n\tconstructor(task, args, context){\n\n\t\treturn function(){\n\t\t\tvar toApply = arguments || [];\n\n\t\t\treturn new Promise( (resolve, reject) => {\n\t\t\t\tvar callback = function(value, err){\n\t\t\t\t\tif (!value && err) {\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresolve(value);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t// Add the callback to the arguments list\n\t\t\t\ttoApply.push(callback);\n\n\t\t\t\t// Apply all arguments to the functions\n\t\t\t\ttask.apply(context || this, toApply);\n\n\t\t\t});\n\n\t\t};\n\n\t}\n}\n\n\nexport default Queue;\nexport { Task };\n"],"names":["Queue","context","requestAnimationFrame","deferred","promise","queued","task","args","defer","inwait","result"],"mappings":"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","x_google_ignoreList":[0]}