UNPKG

fastds

Version:

Fast, Zero-Dependency, TypeScript-based data structures for high-performance applications.

101 lines (99 loc) 2.84 kB
import { RingBuffer } from "./ring-buffer.js"; export class BinarySearchArray { #buffer; #comparator; constructor(comparator){ this.#buffer = new RingBuffer(); this.#comparator = comparator; } [Symbol.toStringTag] = 'BinarySearchArray'; get length() { return this.#buffer.length; } at(index) { return this.#buffer.peekAt(index); } lowerBound(value) { const length = this.#buffer.length; if (length === 0) return 0; const buffer = this.#buffer; const comparator = this.#comparator; let left = 0; let right = length; while(left < right){ const mid = left + right >>> 1; const midValue = buffer.peekAt(mid); if (comparator(midValue, value) < 0) { left = mid + 1; } else { right = mid; } } return left; } upperBound(value) { const length = this.#buffer.length; if (length === 0) return 0; const buffer = this.#buffer; const comparator = this.#comparator; let left = 0; let right = length; while(left < right){ const mid = left + right >>> 1; const midValue = buffer.peekAt(mid); if (comparator(midValue, value) <= 0) { left = mid + 1; } else { right = mid; } } return left; } indexOf(value, index = 0) { const length = this.#buffer.length; if (length === 0 || index >= length) return -1; const buffer = this.#buffer; const comparator = this.#comparator; let left = index; let right = length - 1; while(left <= right){ const mid = left + right >>> 1; const midValue = buffer.peekAt(mid); const cmp = comparator(midValue, value); if (cmp === 0) { return mid; } else if (cmp < 0) { left = mid + 1; } else { right = mid - 1; } } return -1; } has(value) { return this.indexOf(value) !== -1; } insert(value) { const index = this.lowerBound(value); this.#buffer.setOne(index, value, true); return index; } removeOne(index) { return this.#buffer.removeOne(index); } removeFirst(value) { const index = this.indexOf(value); return this.#buffer.removeOne(index); } remove(index, count) { this.#buffer.deallocate(index, count); return this; } iter() { return this.#buffer.iter(); } [Symbol.iterator]() { return this.#buffer[Symbol.iterator](); } } //# sourceMappingURL=binary-search.js.map