65 lines
No EOL
1.4 KiB
JavaScript
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];
|
|
}
|
|
};
|
|
} |