45 lines
1.0 KiB
JavaScript
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;
|