@naturalcycles/js-lib
Version:
Standard library for universal (browser + Node.js) javascript
56 lines (55 loc) • 1.41 kB
JavaScript
import { Array2 } from './array2.js';
import { comparators } from './sort.js';
/**
* Like Array, but keeps values sorted after every insertion.
*/
export class SortedArray extends Array2 {
constructor(values = [], opt = {}) {
super(...values);
this.#comparator = opt.comparator;
this.resort();
}
#comparator;
push(...values) {
const length = super.push(...values);
this.resort();
return length;
}
unshift(...values) {
const length = super.unshift(...values);
this.resort();
return length;
}
splice(start, deleteCount, ...items) {
const removed = super.splice(start, deleteCount ?? this.length - start, ...items);
if (items.length) {
this.resort();
}
return removed;
}
static get [Symbol.species]() {
return Array;
}
get [Symbol.toStringTag]() {
return 'Array';
}
resort() {
super.sort(this.#comparator);
}
}
export class SortedStringArray extends SortedArray {
constructor(values = []) {
super(values);
}
get [Symbol.toStringTag]() {
return 'Array';
}
}
export class SortedNumberArray extends SortedArray {
constructor(values = []) {
super(values, { comparator: comparators.numericAsc });
}
get [Symbol.toStringTag]() {
return 'Array';
}
}