| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 | /** * A queue that can enqueue items at the end, and dequeue items from the front. * * @alias Queue * @constructor */function Queue() {  this._array = [];  this._offset = 0;  this._length = 0;}Object.defineProperties(Queue.prototype, {  /**   * The length of the queue.   *   * @memberof Queue.prototype   *   * @type {Number}   * @readonly   */  length: {    get: function () {      return this._length;    },  },});/** * Enqueues the specified item. * * @param {*} item The item to enqueue. */Queue.prototype.enqueue = function (item) {  this._array.push(item);  this._length++;};/** * Dequeues an item.  Returns undefined if the queue is empty. * * @returns {*} The the dequeued item. */Queue.prototype.dequeue = function () {  if (this._length === 0) {    return undefined;  }  const array = this._array;  let offset = this._offset;  const item = array[offset];  array[offset] = undefined;  offset++;  if (offset > 10 && offset * 2 > array.length) {    //compact array    this._array = array.slice(offset);    offset = 0;  }  this._offset = offset;  this._length--;  return item;};/** * Returns the item at the front of the queue.  Returns undefined if the queue is empty. * * @returns {*} The item at the front of the queue. */Queue.prototype.peek = function () {  if (this._length === 0) {    return undefined;  }  return this._array[this._offset];};/** * Check whether this queue contains the specified item. * * @param {*} item The item to search for. */Queue.prototype.contains = function (item) {  return this._array.indexOf(item) !== -1;};/** * Remove all items from the queue. */Queue.prototype.clear = function () {  this._array.length = this._offset = this._length = 0;};/** * Sort the items in the queue in-place. * * @param {Queue.Comparator} compareFunction A function that defines the sort order. */Queue.prototype.sort = function (compareFunction) {  if (this._offset > 0) {    //compact array    this._array = this._array.slice(this._offset);    this._offset = 0;  }  this._array.sort(compareFunction);};/** * A function used to compare two items while sorting a queue. * @callback Queue.Comparator * * @param {*} a An item in the array. * @param {*} b An item in the array. * @returns {Number} Returns a negative value if <code>a</code> is less than <code>b</code>, *          a positive value if <code>a</code> is greater than <code>b</code>, or *          0 if <code>a</code> is equal to <code>b</code>. * * @example * function compareNumbers(a, b) { *     return a - b; * } */export default Queue;
 |