49 lines
940 B
JavaScript
49 lines
940 B
JavaScript
|
'use strict';
|
||
|
|
||
|
// Simple FIFO queue implementation to avoid having to do shift()
|
||
|
// on an array, which is slow.
|
||
|
|
||
|
function Queue() {
|
||
|
this.length = 0;
|
||
|
}
|
||
|
|
||
|
Queue.prototype.push = function (item) {
|
||
|
var node = {item: item};
|
||
|
if (this.last) {
|
||
|
this.last = this.last.next = node;
|
||
|
} else {
|
||
|
this.last = this.first = node;
|
||
|
}
|
||
|
this.length++;
|
||
|
};
|
||
|
|
||
|
Queue.prototype.shift = function () {
|
||
|
var node = this.first;
|
||
|
if (node) {
|
||
|
this.first = node.next;
|
||
|
if (!(--this.length)) {
|
||
|
this.last = undefined;
|
||
|
}
|
||
|
return node.item;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
Queue.prototype.slice = function (start, end) {
|
||
|
start = typeof start === 'undefined' ? 0 : start;
|
||
|
end = typeof end === 'undefined' ? Infinity : end;
|
||
|
|
||
|
var output = [];
|
||
|
|
||
|
var i = 0;
|
||
|
for (var node = this.first; node; node = node.next) {
|
||
|
if (--end < 0) {
|
||
|
break;
|
||
|
} else if (++i > start) {
|
||
|
output.push(node.item);
|
||
|
}
|
||
|
}
|
||
|
return output;
|
||
|
}
|
||
|
|
||
|
module.exports = Queue;
|