UNPKG

fastds

Version:

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

1 lines 5.09 kB
{"version":3,"sources":["../src/binary-search.ts"],"sourcesContent":["import { RingBuffer } from './ring-buffer.js';\n\nexport interface Comparator<T> {\n (a: T, b: T): number;\n}\n\nexport class BinarySearchArray<T> implements Iterable<T, void, unknown> {\n #buffer: RingBuffer<T>;\n #comparator: Comparator<T>;\n\n constructor(comparator: Comparator<T>) {\n this.#buffer = new RingBuffer();\n this.#comparator = comparator;\n }\n\n readonly [Symbol.toStringTag] = 'BinarySearchArray';\n\n get length(): number {\n return this.#buffer.length;\n }\n\n at(index: number) {\n return this.#buffer.peekAt(index);\n }\n\n lowerBound(value: T): number {\n const length = this.#buffer.length;\n if (length === 0) return 0;\n\n let left = 0;\n let right = length;\n\n while (left < right) {\n const mid = (left + right) >>> 1;\n if (this.#comparator(this.#buffer.peekAt(mid)!, value) < 0) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n\n return left;\n }\n\n upperBound(value: T): number {\n const length = this.#buffer.length;\n if (length === 0) return 0;\n\n let left = 0;\n let right = length;\n\n while (left < right) {\n const mid = (left + right) >>> 1;\n if (this.#comparator(this.#buffer.peekAt(mid)!, value) <= 0) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n\n return left;\n }\n\n indexOf(value: T, index = 0) {\n const length = this.#buffer.length;\n if (length === 0 || index >= length) return -1;\n\n let left = index;\n let right = length - 1;\n\n while (left <= right) {\n const mid = (left + right) >>> 1;\n const cmp = this.#comparator(this.#buffer.peekAt(mid)!, value);\n\n if (cmp === 0) {\n return mid;\n } else if (cmp < 0) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n\n return -1;\n }\n\n has(value: T): boolean {\n return this.indexOf(value) !== -1;\n }\n\n insert(value: T) {\n const index = this.lowerBound(value);\n this.#buffer.setOne(index, value, true);\n\n return index;\n }\n\n removeOne(index: number) {\n return this.#buffer.removeOne(index);\n }\n\n removeFirst(value: T) {\n const index = this.indexOf(value);\n return this.#buffer.removeOne(index);\n }\n\n remove(index: number, count: number): this {\n this.#buffer.deallocate(index, count);\n\n return this;\n }\n\n iter() {\n return this.#buffer.iter();\n }\n\n [Symbol.iterator](): Iterator<T> {\n return this.#buffer[Symbol.iterator]();\n }\n}\n"],"names":["BinarySearchArray","constructor","comparator","RingBuffer","Symbol","toStringTag","length","at","index","peekAt","lowerBound","value","left","right","mid","upperBound","indexOf","cmp","has","insert","setOne","removeOne","removeFirst","remove","count","deallocate","iter","iterator"],"mappings":"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"}