3 Object.defineProperty(exports, "__esModule", {
6 exports.default = queue;
8 var _baseIndexOf = require('lodash/_baseIndexOf');
10 var _baseIndexOf2 = _interopRequireDefault(_baseIndexOf);
12 var _isArray = require('lodash/isArray');
14 var _isArray2 = _interopRequireDefault(_isArray);
16 var _noop = require('lodash/noop');
18 var _noop2 = _interopRequireDefault(_noop);
20 var _baseRest = require('lodash/_baseRest');
22 var _baseRest2 = _interopRequireDefault(_baseRest);
24 var _onlyOnce = require('./onlyOnce');
26 var _onlyOnce2 = _interopRequireDefault(_onlyOnce);
28 var _setImmediate = require('./setImmediate');
30 var _setImmediate2 = _interopRequireDefault(_setImmediate);
32 var _DoublyLinkedList = require('./DoublyLinkedList');
34 var _DoublyLinkedList2 = _interopRequireDefault(_DoublyLinkedList);
36 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
38 function queue(worker, concurrency, payload) {
39 if (concurrency == null) {
41 } else if (concurrency === 0) {
42 throw new Error('Concurrency must not be zero');
45 function _insert(data, insertAtFront, callback) {
46 if (callback != null && typeof callback !== 'function') {
47 throw new Error('task callback must be a function');
50 if (!(0, _isArray2.default)(data)) {
53 if (data.length === 0 && q.idle()) {
54 // call drain immediately if there are no tasks
55 return (0, _setImmediate2.default)(function () {
60 for (var i = 0, l = data.length; i < l; i++) {
63 callback: callback || _noop2.default
67 q._tasks.unshift(item);
72 (0, _setImmediate2.default)(q.process);
75 function _next(tasks) {
76 return (0, _baseRest2.default)(function (args) {
79 for (var i = 0, l = tasks.length; i < l; i++) {
81 var index = (0, _baseIndexOf2.default)(workersList, task, 0);
83 workersList.splice(index);
86 task.callback.apply(task, args);
88 if (args[0] != null) {
89 q.error(args[0], task.data);
93 if (workers <= q.concurrency - q.buffer) {
105 var workersList = [];
107 _tasks: new _DoublyLinkedList2.default(),
108 concurrency: concurrency,
110 saturated: _noop2.default,
111 unsaturated: _noop2.default,
112 buffer: concurrency / 4,
113 empty: _noop2.default,
114 drain: _noop2.default,
115 error: _noop2.default,
118 push: function (data, callback) {
119 _insert(data, false, callback);
122 q.drain = _noop2.default;
125 unshift: function (data, callback) {
126 _insert(data, true, callback);
128 process: function () {
129 while (!q.paused && workers < q.concurrency && q._tasks.length) {
132 var l = q._tasks.length;
133 if (q.payload) l = Math.min(l, q.payload);
134 for (var i = 0; i < l; i++) {
135 var node = q._tasks.shift();
137 data.push(node.data);
140 if (q._tasks.length === 0) {
144 workersList.push(tasks[0]);
146 if (workers === q.concurrency) {
150 var cb = (0, _onlyOnce2.default)(_next(tasks));
154 length: function () {
155 return q._tasks.length;
157 running: function () {
160 workersList: function () {
164 return q._tasks.length + workers === 0;
169 resume: function () {
170 if (q.paused === false) {
174 var resumeCount = Math.min(q.concurrency, q._tasks.length);
175 // Need to call q.process once per concurrent
176 // worker to preserve full concurrency after pause
177 for (var w = 1; w <= resumeCount; w++) {
178 (0, _setImmediate2.default)(q.process);
184 module.exports = exports['default'];