| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 | /** * PriorityQueue * Elements in this queue are sorted according to their value * * @author Lukasz Krawczyk <contact@lukaszkrawczyk.eu> * @copyright MIT *//** * PriorityQueue class construcotr * @constructor * * @example * queue: [1,2,3,4] * priorities: [4,1,2,3] * > result = [1,4,2,3] * * @param {Array} elements * @param {Array} priorities * @param {string} sorting - asc / desc * @returns {PriorityQueue} */function PriorityQueue(elements, priorities, sorting) {  /** @type {Array} */  this._queue = [];  /** @type {Array} */  this._priorities = [];  /** @type {string} */  this._sorting = 'desc';  this._init(elements, priorities, sorting);};/** * Insert element * * @param {Object} ele * @param {Object} priority * @returns {undefined} * @access public */PriorityQueue.prototype.insert = function(ele, priority) {  var indexToInsert = this._queue.length;  var index = indexToInsert;  while (index--) {    var priority2 = this._priorities[index];    if (this._sorting === 'desc') {      if (priority > priority2) {        indexToInsert = index;      }    } else {      if (priority < priority2) {        indexToInsert = index;      }    }  }  this._insertAt(ele, priority, indexToInsert);};/** * Remove element * * @param {Object} ele * @returns {undefined} * @access public */PriorityQueue.prototype.remove = function(ele) {  var index = this._queue.length;  while (index--) {    var ele2 = this._queue[index];    if (ele === ele2) {      this._queue.splice(index, 1);      this._priorities.splice(index, 1);      break;    }  }};/** * For each loop wrapper * * @param {function} func * @returs {undefined} * @access public */PriorityQueue.prototype.forEach = function(func) {  this._queue.forEach(func);};/** * @returns {Array} * @access public */PriorityQueue.prototype.getElements = function() {  return this._queue;};/** * @param {number} index * @returns {Object} * @access public */PriorityQueue.prototype.getElementPriority = function(index) {  return this._priorities[index];};/** * @returns {Array} * @access public */PriorityQueue.prototype.getPriorities = function() {  return this._priorities;};/** * @returns {Array} * @access public */PriorityQueue.prototype.getElementsWithPriorities = function() {  var result = [];  for (var i = 0, l = this._queue.length; i < l; i++) {    result.push([this._queue[i], this._priorities[i]]);  }  return result;};/** * Set object properties * * @param {Array} elements * @param {Array} priorities * @returns {undefined} * @access protected */PriorityQueue.prototype._init = function(elements, priorities, sorting) {  if (elements && priorities) {    this._queue = [];    this._priorities = [];    if (elements.length !== priorities.length) {      throw new Error('Arrays must have the same length');    }    for (var i = 0; i < elements.length; i++) {      this.insert(elements[i], priorities[i]);    }  }  if (sorting) {    this._sorting = sorting;  }};/** * Insert element at given position * * @param {Object} ele * @param {number} index * @returns {undefined} * @access protected */PriorityQueue.prototype._insertAt = function(ele, priority, index) {  if (this._queue.length === index) {    this._queue.push(ele);    this._priorities.push(priority);  } else {    this._queue.splice(index, 0, ele);    this._priorities.splice(index, 0, priority);  }};if (typeof module !== 'undefined' && module.exports) {  module.exports = PriorityQueue;}
 |