| import type { SourceMapSegment, ReverseSegment } from './sourcemap-segment'; |
| import { COLUMN } from './sourcemap-segment'; |
|
|
| export type MemoState = { |
| lastKey: number; |
| lastNeedle: number; |
| lastIndex: number; |
| }; |
|
|
| export let found = false; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| export function binarySearch( |
| haystack: SourceMapSegment[] | ReverseSegment[], |
| needle: number, |
| low: number, |
| high: number, |
| ): number { |
| while (low <= high) { |
| const mid = low + ((high - low) >> 1); |
| const cmp = haystack[mid][COLUMN] - needle; |
|
|
| if (cmp === 0) { |
| found = true; |
| return mid; |
| } |
|
|
| if (cmp < 0) { |
| low = mid + 1; |
| } else { |
| high = mid - 1; |
| } |
| } |
|
|
| found = false; |
| return low - 1; |
| } |
|
|
| export function upperBound( |
| haystack: SourceMapSegment[] | ReverseSegment[], |
| needle: number, |
| index: number, |
| ): number { |
| for (let i = index + 1; i < haystack.length; index = i++) { |
| if (haystack[i][COLUMN] !== needle) break; |
| } |
| return index; |
| } |
|
|
| export function lowerBound( |
| haystack: SourceMapSegment[] | ReverseSegment[], |
| needle: number, |
| index: number, |
| ): number { |
| for (let i = index - 1; i >= 0; index = i--) { |
| if (haystack[i][COLUMN] !== needle) break; |
| } |
| return index; |
| } |
|
|
| export function memoizedState(): MemoState { |
| return { |
| lastKey: -1, |
| lastNeedle: -1, |
| lastIndex: -1, |
| }; |
| } |
|
|
| |
| |
| |
| |
| export function memoizedBinarySearch( |
| haystack: SourceMapSegment[] | ReverseSegment[], |
| needle: number, |
| state: MemoState, |
| key: number, |
| ): number { |
| const { lastKey, lastNeedle, lastIndex } = state; |
|
|
| let low = 0; |
| let high = haystack.length - 1; |
| if (key === lastKey) { |
| if (needle === lastNeedle) { |
| found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle; |
| return lastIndex; |
| } |
|
|
| if (needle >= lastNeedle) { |
| |
| low = lastIndex === -1 ? 0 : lastIndex; |
| } else { |
| high = lastIndex; |
| } |
| } |
| state.lastKey = key; |
| state.lastNeedle = needle; |
|
|
| return (state.lastIndex = binarySearch(haystack, needle, low, high)); |
| } |
|
|