You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

56 lines
1.7 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.sortedLastIndex = exports.addElementsToSortedArray = exports.addElementToSortedArray = void 0;
/**
* Add element to a sorted array
*/
function addElementToSortedArray(array, element, compare) {
const index = sortedLastIndex(array, (target) => compare(target, element));
array.splice(index, 0, element);
}
exports.addElementToSortedArray = addElementToSortedArray;
/**
* Add element to a sorted array
*/
function addElementsToSortedArray(array, elements, compare) {
if (!elements.length) {
return;
}
let last = elements[0];
let index = sortedLastIndex(array, (target) => compare(target, last));
for (const element of elements) {
if (compare(last, element) > 0) {
index = sortedLastIndex(array, (target) => compare(target, element));
}
let e = array[index];
while (e && compare(e, element) <= 0) {
e = array[++index];
}
array.splice(index, 0, element);
last = element;
}
}
exports.addElementsToSortedArray = addElementsToSortedArray;
/**
* Uses a binary search to determine the highest index at which value should be inserted into array in order to maintain its sort order.
*/
function sortedLastIndex(array, compare) {
let lower = 0;
let upper = array.length;
while (lower < upper) {
const mid = Math.floor(lower + (upper - lower) / 2);
const target = compare(array[mid]);
if (target < 0) {
lower = mid + 1;
}
else if (target > 0) {
upper = mid;
}
else {
return mid + 1;
}
}
return upper;
}
exports.sortedLastIndex = sortedLastIndex;