forked from mirror/ledisdb
60 lines
1.3 KiB
JavaScript
60 lines
1.3 KiB
JavaScript
|
// Queue class adapted from Tim Caswell's pattern library
|
||
|
// http://github.com/creationix/pattern/blob/master/lib/pattern/queue.js
|
||
|
|
||
|
function Queue() {
|
||
|
this.tail = [];
|
||
|
this.head = [];
|
||
|
this.offset = 0;
|
||
|
}
|
||
|
|
||
|
Queue.prototype.shift = function () {
|
||
|
if (this.offset === this.head.length) {
|
||
|
var tmp = this.head;
|
||
|
tmp.length = 0;
|
||
|
this.head = this.tail;
|
||
|
this.tail = tmp;
|
||
|
this.offset = 0;
|
||
|
if (this.head.length === 0) {
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
return this.head[this.offset++]; // sorry, JSLint
|
||
|
};
|
||
|
|
||
|
Queue.prototype.push = function (item) {
|
||
|
return this.tail.push(item);
|
||
|
};
|
||
|
|
||
|
Queue.prototype.forEach = function (fn, thisv) {
|
||
|
var array = this.head.slice(this.offset), i, il;
|
||
|
|
||
|
array.push.apply(array, this.tail);
|
||
|
|
||
|
if (thisv) {
|
||
|
for (i = 0, il = array.length; i < il; i += 1) {
|
||
|
fn.call(thisv, array[i], i, array);
|
||
|
}
|
||
|
} else {
|
||
|
for (i = 0, il = array.length; i < il; i += 1) {
|
||
|
fn(array[i], i, array);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return array;
|
||
|
};
|
||
|
|
||
|
Queue.prototype.getLength = function () {
|
||
|
return this.head.length - this.offset + this.tail.length;
|
||
|
};
|
||
|
|
||
|
Object.defineProperty(Queue.prototype, "length", {
|
||
|
get: function () {
|
||
|
return this.getLength();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
|
||
|
if (typeof module !== "undefined" && module.exports) {
|
||
|
module.exports = Queue;
|
||
|
}
|