Files
meteor/packages/constraint-solver/priority-queue.js
2014-06-17 17:27:10 -07:00

63 lines
1.2 KiB
JavaScript

PriorityQueue = function () {
var self = this;
var compareArrays = function (a, b) {
for (var i = 0; i < a.length; i++)
if (a[i] !== b[i])
if (a[i] instanceof Array)
return compareArrays(a[i], b[i]);
else
return a[i] - b[i];
return 0;
};
// id -> cost
self._heap = new MinHeap(function (a, b) {
return compareArrays(a, b);
});
// id -> reference to item
self._items = {};
};
_.extend(PriorityQueue.prototype, {
push: function (item, cost) {
var self = this;
var id = Random.id();
self._heap.set(id, cost);
self._items[id] = item;
},
top: function () {
var self = this;
if (self.empty())
throw new Error("The queue is empty");
var id = self._heap.minElementId();
return self._items[id];
},
pop: function () {
var self = this;
if (self.empty())
throw new Error("The queue is empty");
var id = self._heap.minElementId();
var item = self._items[id];
delete self._items[id];
self._heap.remove(id);
return item;
},
empty: function () {
var self = this;
return self._heap.empty();
},
size: function () {
var self = this;
return self._heap.size();
}
});