0
0
Fork 0
AdventOfCode/utils/javascript/SortedList.mjs
2024-12-01 15:48:53 -07:00

65 lines
No EOL
1.4 KiB
JavaScript

export class SortedList {
#data = [];
add(value) {
// Simple cases that we can short-circuit on
if (this.#data.length === 0 || this.#data.at(-1) < value) {
this.#data.push(value);
return;
};
if (this.#data.at(0) > value) {
this.#data.unshift(value);
return
};
let locationToAdd;
let lStart = 0;
let lEnd = this.#data.length;
do {
let midpoint = Math.floor((lStart + lEnd) / 2);
if (lStart > lEnd) {
// console.log(`breaking for ${value} at lStart=${lStart}, lEnd=${lEnd}`)
locationToAdd = lStart;
break
};
let valAtMidpoint =this.#data.at(midpoint);
if (valAtMidpoint < value) {
// console.log(`${valAtMidpoint} < ${value}, using second half of list`)
lStart = midpoint + 1;
}
else if (valAtMidpoint > value) {
// console.log(`${valAtMidpoint} > ${value}, using first half of list`)
lEnd = midpoint - 1;
}
else {
locationToAdd = midpoint;
}
} while (locationToAdd === undefined);
// console.log(`locationToAdd (${value}) = ${locationToAdd}`);
this.#data.splice(locationToAdd, 0, value);
};
get size() {
return this.#data.length;
}
at(index) {
return this.#data.at(index);
}
*iter() {
// console.log(JSON.stringify(this.#data))
const size = this.#data.length;
for (var i = 0; i < size; i++) {
// if (i === size - 1) {
// yield this.#data[i]
// }
yield this.#data[i];
}
};
}