percolateUp(pos) { const heap = this[kHeap]; const compare = this[kCompare]; const setPosition = this[kSetPosition]; const item = heap[pos]; while (pos > 1) { const parent = heap[pos / 2 | 0]; if (compare(parent, item) <= 0) break; heap[pos] = parent; if (setPosition !== undefined) setPosition(parent, pos); pos = pos / 2 | 0; } heap[pos] = item; if (setPosition !== undefined) setPosition(item, pos); } removeAt(pos) { const heap = this[kHeap]; const size = --this[kSize]; heap[pos] = heap[size + 1]; heap[size + 1] = undefined; if (size > 0 && pos <= size) { if (pos > 1 && this[kCompare](heap[pos / 2 | 0], heap[pos]) > 0) this.percolateUp(pos); else this.percolateDown(pos); } } shift() { const heap = this[kHeap]; const value = heap[1]; if (value === undefined) return; this.removeAt(1); return value; } };