UNPKG

@metamask/ocap-kernel

Version:
1 lines 2.37 kB
{"version":3,"file":"key-search.cjs","sourceRoot":"","sources":["../../src/utils/key-search.ts"],"names":[],"mappings":";;AAaA,8BAwCC;AArDD;;;;;;;;;;;;GAYG;AACH,SAAgB,SAAS,CAAC,GAAa,EAAE,GAAW;IAClD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IAED,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,GAAG,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAEzB,iCAAiC;IACjC,IAAI,GAAG,GAAI,GAAG,CAAC,CAAC,CAAY,EAAE,CAAC;QAC7B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,mCAAmC;IACnC,IAAI,GAAG,GAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAY,EAAE,CAAC;QAC1C,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IAED,iCAAiC;IACjC,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,0BAA0B;IAC1B,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAExC,cAAc;QACd,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;YACrB,OAAO,GAAG,CAAC;QACb,CAAC;QAED,IAAI,GAAG,GAAI,GAAG,CAAC,GAAG,CAAY,EAAE,CAAC;YAC/B,GAAG,GAAG,GAAG,CAAC;QACZ,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["/**\n * Binary search for key position.\n *\n * I totally can't believe I have to write this in 2025, but the JS Array\n * `indexOf` function does exhaustive search (O(n) instead of O(ln(N))) because\n * it can't know the array is both sorted and has no undefined elements.\n *\n * @param arr - A sorted array of strings.\n * @param key - The key to search `arr` for.\n *\n * @returns the index into `arr` of the first key that is greater than\n * `key`, or -1 if no such key exists.\n */\nexport function keySearch(arr: string[], key: string): number {\n if (arr === null || arr.length === 0) {\n return -1;\n }\n\n let beg = 0;\n let end = arr.length - 1;\n\n // Key is less than first element\n if (key < (arr[0] as string)) {\n return 0;\n }\n\n // Key is greater than last element\n if (key > (arr[arr.length - 1] as string)) {\n return -1;\n }\n\n // Exact match with first element\n if (key === arr[0]) {\n return 0;\n }\n\n // Binary search algorithm\n while (beg < end) {\n const mid = Math.floor((beg + end) / 2);\n\n // Exact match\n if (arr[mid] === key) {\n return mid;\n }\n\n if (key < (arr[mid] as string)) {\n end = mid;\n } else {\n beg = mid + 1;\n }\n }\n\n return beg;\n}\n"]}