UNPKG

plotly-icons

Version:
136 lines (111 loc) 3.1 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _promise = require('babel-runtime/core-js/promise'); var _promise2 = _interopRequireDefault(_promise); var _assign = require('babel-runtime/core-js/object/assign'); var _assign2 = _interopRequireDefault(_assign); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // based on https://github.com/sindresorhus/p-queue (MIT) // modified for browser support var Queue = function () { function Queue() { (0, _classCallCheck3.default)(this, Queue); this._queue = []; } (0, _createClass3.default)(Queue, [{ key: 'enqueue', value: function enqueue(run) { this._queue.push(run); } }, { key: 'dequeue', value: function dequeue() { return this._queue.shift(); } }, { key: 'size', get: function get() { return this._queue.length; } }]); return Queue; }(); var PQueue = function () { function PQueue(opts) { (0, _classCallCheck3.default)(this, PQueue); opts = (0, _assign2.default)({ concurrency: Infinity, queueClass: Queue }, opts); if (opts.concurrency < 1) { throw new TypeError('Expected `concurrency` to be a number from 1 and up'); } this.queue = new opts.queueClass(); // eslint-disable-line new-cap this._pendingCount = 0; this._concurrency = opts.concurrency; this._resolveEmpty = function () {}; } (0, _createClass3.default)(PQueue, [{ key: '_next', value: function _next() { this._pendingCount--; if (this.queue.size > 0) { this.queue.dequeue()(); } else { this._resolveEmpty(); } } }, { key: 'add', value: function add(fn, opts) { var _this = this; return new _promise2.default(function (resolve, reject) { var run = function run() { _this._pendingCount++; fn().then(function (val) { resolve(val); _this._next(); }, function (err) { reject(err); _this._next(); }); }; if (_this._pendingCount < _this._concurrency) { run(); } else { _this.queue.enqueue(run, opts); } }); } }, { key: 'onEmpty', value: function onEmpty() { var _this2 = this; return new _promise2.default(function (resolve) { var existingResolve = _this2._resolveEmpty; _this2._resolveEmpty = function () { existingResolve(); resolve(); }; }); } }, { key: 'size', get: function get() { return this.queue.size; } }, { key: 'pending', get: function get() { return this._pendingCount; } }]); return PQueue; }(); exports.default = PQueue;