| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 | 
							- "use strict";
 
- function arrayMove(src, srcIndex, dst, dstIndex, len) {
 
-     for (var j = 0; j < len; ++j) {
 
-         dst[j + dstIndex] = src[j + srcIndex];
 
-         src[j + srcIndex] = void 0;
 
-     }
 
- }
 
- function Queue(capacity) {
 
-     this._capacity = capacity;
 
-     this._length = 0;
 
-     this._front = 0;
 
- }
 
- Queue.prototype._willBeOverCapacity = function (size) {
 
-     return this._capacity < size;
 
- };
 
- Queue.prototype._pushOne = function (arg) {
 
-     var length = this.length();
 
-     this._checkCapacity(length + 1);
 
-     var i = (this._front + length) & (this._capacity - 1);
 
-     this[i] = arg;
 
-     this._length = length + 1;
 
- };
 
- Queue.prototype.push = function (fn, receiver, arg) {
 
-     var length = this.length() + 3;
 
-     if (this._willBeOverCapacity(length)) {
 
-         this._pushOne(fn);
 
-         this._pushOne(receiver);
 
-         this._pushOne(arg);
 
-         return;
 
-     }
 
-     var j = this._front + length - 3;
 
-     this._checkCapacity(length);
 
-     var wrapMask = this._capacity - 1;
 
-     this[(j + 0) & wrapMask] = fn;
 
-     this[(j + 1) & wrapMask] = receiver;
 
-     this[(j + 2) & wrapMask] = arg;
 
-     this._length = length;
 
- };
 
- Queue.prototype.shift = function () {
 
-     var front = this._front,
 
-         ret = this[front];
 
-     this[front] = undefined;
 
-     this._front = (front + 1) & (this._capacity - 1);
 
-     this._length--;
 
-     return ret;
 
- };
 
- Queue.prototype.length = function () {
 
-     return this._length;
 
- };
 
- Queue.prototype._checkCapacity = function (size) {
 
-     if (this._capacity < size) {
 
-         this._resizeTo(this._capacity << 1);
 
-     }
 
- };
 
- Queue.prototype._resizeTo = function (capacity) {
 
-     var oldCapacity = this._capacity;
 
-     this._capacity = capacity;
 
-     var front = this._front;
 
-     var length = this._length;
 
-     var moveItemsCount = (front + length) & (oldCapacity - 1);
 
-     arrayMove(this, 0, this, oldCapacity, moveItemsCount);
 
- };
 
- module.exports = Queue;
 
 
  |