{"version":3,"file":"Scheduler.mjs","sourceRoot":"","sources":["../../src/Scheduler.ts"],"names":[],"mappings":"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","sourcesContent":["import { Handle } from './interfaces';\nimport { QueueItem, queueTask } from './queue';\n\nfunction getQueueHandle(item: QueueItem): Handle {\n\treturn {\n\t\tdestroy: function(this: Handle) {\n\t\t\tthis.destroy = function() {};\n\t\t\titem.isActive = false;\n\t\t\titem.callback = null;\n\t\t}\n\t};\n}\n\nexport interface KwArgs {\n\tdeferWhileProcessing?: boolean;\n\tqueueFunction?: (callback: (...args: any[]) => any) => Handle;\n}\n\nexport default class Scheduler {\n\tprotected readonly _boundDispatch: () => void;\n\tprotected _deferred: QueueItem[] | null = null;\n\tprotected _isProcessing: boolean;\n\tprotected readonly _queue: QueueItem[];\n\tprotected _task: Handle | null = null;\n\n\t/**\n\t * Determines whether any callbacks registered during should be added to the current batch (`false`)\n\t * or deferred until the next batch (`true`, default).\n\t */\n\tdeferWhileProcessing: boolean | undefined;\n\n\t/**\n\t * Allows users to specify the function that should be used to schedule callbacks.\n\t * If no function is provided, then `queueTask` will be used.\n\t */\n\tqueueFunction: (callback: (...args: any[]) => any) => Handle;\n\n\tprotected _defer(callback: (...args: any[]) => void): Handle {\n\t\tconst item: QueueItem = {\n\t\t\tisActive: true,\n\t\t\tcallback: callback\n\t\t};\n\n\t\tif (!this._deferred) {\n\t\t\tthis._deferred = [];\n\t\t}\n\n\t\tthis._deferred.push(item);\n\n\t\treturn getQueueHandle(item);\n\t}\n\n\tprotected _dispatch(): void {\n\t\tthis._isProcessing = true;\n\t\tif (this._task) {\n\t\t\tthis._task.destroy();\n\t\t\tthis._task = null;\n\t\t}\n\n\t\tconst queue = this._queue;\n\t\tlet item: QueueItem | undefined;\n\n\t\twhile ((item = queue.shift())) {\n\t\t\tif (item.isActive && item.callback) {\n\t\t\t\titem.callback();\n\t\t\t}\n\t\t}\n\n\t\tthis._isProcessing = false;\n\n\t\tlet deferred: QueueItem[] | null = this._deferred;\n\t\tif (deferred && deferred.length) {\n\t\t\tthis._deferred = null;\n\n\t\t\tlet item: QueueItem | undefined;\n\t\t\twhile ((item = deferred.shift())) {\n\t\t\t\tthis._schedule(item);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _schedule(item: QueueItem): void {\n\t\tif (!this._task) {\n\t\t\tthis._task = this.queueFunction(this._boundDispatch);\n\t\t}\n\n\t\tthis._queue.push(item);\n\t}\n\n\tconstructor(kwArgs?: KwArgs) {\n\t\tthis.deferWhileProcessing = kwArgs && 'deferWhileProcessing' in kwArgs ? kwArgs.deferWhileProcessing : true;\n\t\tthis.queueFunction = kwArgs && kwArgs.queueFunction ? kwArgs.queueFunction : queueTask;\n\n\t\tthis._boundDispatch = this._dispatch.bind(this);\n\t\tthis._isProcessing = false;\n\t\tthis._queue = [];\n\t}\n\n\tschedule(callback: (...args: any[]) => void): Handle {\n\t\tif (this._isProcessing && this.deferWhileProcessing) {\n\t\t\treturn this._defer(callback);\n\t\t}\n\n\t\tconst item: QueueItem = {\n\t\t\tisActive: true,\n\t\t\tcallback: callback\n\t\t};\n\n\t\tthis._schedule(item);\n\n\t\treturn getQueueHandle(item);\n\t}\n}\n"]}