2025-04-24 17:03:28 +08:00

45 lines
1.0 KiB
JavaScript

"use strict";
// Most of the code comes from co-queue created by Julian Gruber
// https://github.com/segmentio/co-queue
var Queue = function() {
this.buffer = [];
this.fns = [];
};
Queue.prototype.push = function(data, priority) {
if (this.fns.length)
return this.fns.shift()(null, data);
var item = { data: data, priority: priority };
var index = sortedIndex(this.buffer, item, function(item) {
return item.priority;
});
this.buffer.splice(index, 0, item);
};
Queue.prototype.next = function() {
var that = this;
return function(fn) {
if (that.buffer.length)
return fn(null, that.buffer.pop().data);
that.fns.push(fn);
};
};
var sortedIndex = function(array, value, transformer) {
// Copied from https://github.com/lodash/lodash
value = transformer(value);
var low = 0;
var high = array ? array.length : low;
while (low < high) {
var mid = (low + high) >>> 1;
(transformer(array[mid]) < value)
? (low = mid + 1)
: (high = mid);
}
return low;
}
module.exports = Queue;