diff options
Diffstat (limited to 'node_modules/nanoscheduler/index.js')
| -rw-r--r-- | node_modules/nanoscheduler/index.js | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/node_modules/nanoscheduler/index.js b/node_modules/nanoscheduler/index.js new file mode 100644 index 00000000..c9dc7535 --- /dev/null +++ b/node_modules/nanoscheduler/index.js @@ -0,0 +1,55 @@ +var assert = require('assert') + +var hasWindow = typeof window !== 'undefined' + +function createScheduler () { + var scheduler + if (hasWindow) { + if (!window._nanoScheduler) window._nanoScheduler = new NanoScheduler(true) + scheduler = window._nanoScheduler + } else { + scheduler = new NanoScheduler() + } + return scheduler +} + +function NanoScheduler (hasWindow) { + this.hasWindow = hasWindow + this.hasIdle = this.hasWindow && window.requestIdleCallback + this.method = this.hasIdle ? window.requestIdleCallback.bind(window) : this.setTimeout + this.scheduled = false + this.queue = [] +} + +NanoScheduler.prototype.push = function (cb) { + assert.equal(typeof cb, 'function', 'nanoscheduler.push: cb should be type function') + + this.queue.push(cb) + this.schedule() +} + +NanoScheduler.prototype.schedule = function () { + if (this.scheduled) return + + this.scheduled = true + var self = this + this.method(function (idleDeadline) { + var cb + while (self.queue.length && idleDeadline.timeRemaining() > 0) { + cb = self.queue.shift() + cb(idleDeadline) + } + self.scheduled = false + if (self.queue.length) self.schedule() + }) +} + +NanoScheduler.prototype.setTimeout = function (cb) { + setTimeout(cb, 0, { + timeRemaining: function () { + return 1 + } + }) +} + +module.exports = createScheduler |
