priorityQueue.js
 1  'use strict';
 2  
 3  Object.defineProperty(exports, "__esModule", {
 4      value: true
 5  });
 6  
 7  exports.default = function (worker, concurrency) {
 8      // Start with a normal queue
 9      var q = (0, _queue2.default)(worker, concurrency);
10  
11      q._tasks = new _Heap2.default();
12  
13      // Override push to accept second parameter representing priority
14      q.push = function (data, priority = 0, callback = () => {}) {
15          if (typeof callback !== 'function') {
16              throw new Error('task callback must be a function');
17          }
18          q.started = true;
19          if (!Array.isArray(data)) {
20              data = [data];
21          }
22          if (data.length === 0 && q.idle()) {
23              // call drain immediately if there are no tasks
24              return (0, _setImmediate2.default)(() => q.drain());
25          }
26  
27          for (var i = 0, l = data.length; i < l; i++) {
28              var item = {
29                  data: data[i],
30                  priority,
31                  callback
32              };
33  
34              q._tasks.push(item);
35          }
36  
37          (0, _setImmediate2.default)(q.process);
38      };
39  
40      // Remove unshift function
41      delete q.unshift;
42  
43      return q;
44  };
45  
46  var _setImmediate = require('./setImmediate');
47  
48  var _setImmediate2 = _interopRequireDefault(_setImmediate);
49  
50  var _queue = require('./queue');
51  
52  var _queue2 = _interopRequireDefault(_queue);
53  
54  var _Heap = require('./internal/Heap');
55  
56  var _Heap2 = _interopRequireDefault(_Heap);
57  
58  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
59  
60  module.exports = exports['default'];
61  
62  /**
63   * The same as [async.queue]{@link module:ControlFlow.queue} only tasks are assigned a priority and
64   * completed in ascending priority order.
65   *
66   * @name priorityQueue
67   * @static
68   * @memberOf module:ControlFlow
69   * @method
70   * @see [async.queue]{@link module:ControlFlow.queue}
71   * @category Control Flow
72   * @param {AsyncFunction} worker - An async function for processing a queued task.
73   * If you want to handle errors from an individual task, pass a callback to
74   * `q.push()`.
75   * Invoked with (task, callback).
76   * @param {number} concurrency - An `integer` for determining how many `worker`
77   * functions should be run in parallel.  If omitted, the concurrency defaults to
78   * `1`.  If the concurrency is `0`, an error is thrown.
79   * @returns {module:ControlFlow.QueueObject} A priorityQueue object to manage the tasks. There are two
80   * differences between `queue` and `priorityQueue` objects:
81   * * `push(task, priority, [callback])` - `priority` should be a number. If an
82   *   array of `tasks` is given, all tasks will be assigned the same priority.
83   * * The `unshift` method was removed.
84   */