Spaces:
Build error
Build error
; | |
Object.defineProperty(exports, '__esModule', { | |
value: true | |
}); | |
exports.default = void 0; | |
function _defineProperty(obj, key, value) { | |
if (key in obj) { | |
Object.defineProperty(obj, key, { | |
value: value, | |
enumerable: true, | |
configurable: true, | |
writable: true | |
}); | |
} else { | |
obj[key] = value; | |
} | |
return obj; | |
} | |
/** | |
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. | |
* | |
* This source code is licensed under the MIT license found in the | |
* LICENSE file in the root directory of this source tree. | |
*/ | |
/** | |
* Priority queue that processes tasks in natural ordering (lower priority first) | |
* accoridng to the priority computed by the function passed in the constructor. | |
* | |
* FIFO ordering isn't guaranteed for tasks with the same priority. | |
* | |
* Worker specific tasks with the same priority as a non-worker specific task | |
* are always processed first. | |
*/ | |
class PriorityQueue { | |
constructor(_computePriority) { | |
_defineProperty(this, '_queue', []); | |
_defineProperty(this, '_sharedQueue', new MinHeap()); | |
this._computePriority = _computePriority; | |
} | |
enqueue(task, workerId) { | |
if (workerId == null) { | |
this._enqueue(task, this._sharedQueue); | |
} else { | |
const queue = this._getWorkerQueue(workerId); | |
this._enqueue(task, queue); | |
} | |
} | |
_enqueue(task, queue) { | |
const item = { | |
priority: this._computePriority(task.request[2], ...task.request[3]), | |
task | |
}; | |
queue.add(item); | |
} | |
dequeue(workerId) { | |
const workerQueue = this._getWorkerQueue(workerId); | |
const workerTop = workerQueue.peek(); | |
const sharedTop = this._sharedQueue.peek(); // use the task from the worker queue if there's no task in the shared queue | |
// or if the priority of the worker queue is smaller or equal to the | |
// priority of the top task in the shared queue. The tasks of the | |
// worker specific queue are preferred because no other worker can pick this | |
// specific task up. | |
if ( | |
sharedTop == null || | |
(workerTop != null && workerTop.priority <= sharedTop.priority) | |
) { | |
var _workerQueue$poll$tas, _workerQueue$poll; | |
return (_workerQueue$poll$tas = | |
(_workerQueue$poll = workerQueue.poll()) === null || | |
_workerQueue$poll === void 0 | |
? void 0 | |
: _workerQueue$poll.task) !== null && _workerQueue$poll$tas !== void 0 | |
? _workerQueue$poll$tas | |
: null; | |
} | |
return this._sharedQueue.poll().task; | |
} | |
_getWorkerQueue(workerId) { | |
let queue = this._queue[workerId]; | |
if (queue == null) { | |
queue = this._queue[workerId] = new MinHeap(); | |
} | |
return queue; | |
} | |
} | |
exports.default = PriorityQueue; | |
class MinHeap { | |
constructor() { | |
_defineProperty(this, '_heap', []); | |
} | |
peek() { | |
var _this$_heap$; | |
return (_this$_heap$ = this._heap[0]) !== null && _this$_heap$ !== void 0 | |
? _this$_heap$ | |
: null; | |
} | |
add(item) { | |
const nodes = this._heap; | |
nodes.push(item); | |
if (nodes.length === 1) { | |
return; | |
} | |
let currentIndex = nodes.length - 1; // Bubble up the added node as long as the parent is bigger | |
while (currentIndex > 0) { | |
const parentIndex = Math.floor((currentIndex + 1) / 2) - 1; | |
const parent = nodes[parentIndex]; | |
if (parent.priority <= item.priority) { | |
break; | |
} | |
nodes[currentIndex] = parent; | |
nodes[parentIndex] = item; | |
currentIndex = parentIndex; | |
} | |
} | |
poll() { | |
const nodes = this._heap; | |
const result = nodes[0]; | |
const lastElement = nodes.pop(); // heap was empty or removed the last element | |
if (result == null || nodes.length === 0) { | |
return result !== null && result !== void 0 ? result : null; | |
} | |
let index = 0; | |
nodes[0] = | |
lastElement !== null && lastElement !== void 0 ? lastElement : null; | |
const element = nodes[0]; | |
while (true) { | |
let swapIndex = null; | |
const rightChildIndex = (index + 1) * 2; | |
const leftChildIndex = rightChildIndex - 1; | |
const rightChild = nodes[rightChildIndex]; | |
const leftChild = nodes[leftChildIndex]; // if the left child is smaller, swap with the left | |
if (leftChild != null && leftChild.priority < element.priority) { | |
swapIndex = leftChildIndex; | |
} // If the right child is smaller or the right child is smaller than the left | |
// then swap with the right child | |
if ( | |
rightChild != null && | |
rightChild.priority < (swapIndex == null ? element : leftChild).priority | |
) { | |
swapIndex = rightChildIndex; | |
} | |
if (swapIndex == null) { | |
break; | |
} | |
nodes[index] = nodes[swapIndex]; | |
nodes[swapIndex] = element; | |
index = swapIndex; | |
} | |
return result; | |
} | |
} | |