| // 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; |
| } |