mirror of
https://github.com/meteor/meteor.git
synced 2026-05-02 03:01:46 -04:00
63 lines
1.2 KiB
JavaScript
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();
|
|
}
|
|
});
|
|
|
|
|