mirror of
https://github.com/denoland/std.git
synced 2024-11-22 04:59:05 +00:00
c46143f0ac
* chore: update copyright year * fix --------- Co-authored-by: Asher Gomez <ashersaupingomez@gmail.com>
50 lines
1.4 KiB
TypeScript
50 lines
1.4 KiB
TypeScript
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
|
// This module is browser compatible.
|
|
|
|
/** Returns the index of the first occurrence of the needle array in the source
|
|
* array, or -1 if it is not present.
|
|
*
|
|
* A start index can be specified as the third argument that begins the search
|
|
* at that given index. The start index defaults to the start of the array.
|
|
*
|
|
* The complexity of this function is O(source.length * needle.length).
|
|
*
|
|
* ```ts
|
|
* import { indexOfNeedle } from "https://deno.land/std@$STD_VERSION/bytes/index_of_needle.ts";
|
|
* const source = new Uint8Array([0, 1, 2, 1, 2, 1, 2, 3]);
|
|
* const needle = new Uint8Array([1, 2]);
|
|
* console.log(indexOfNeedle(source, needle)); // 1
|
|
* console.log(indexOfNeedle(source, needle, 2)); // 3
|
|
* ```
|
|
*/
|
|
export function indexOfNeedle(
|
|
source: Uint8Array,
|
|
needle: Uint8Array,
|
|
start = 0,
|
|
): number {
|
|
if (start >= source.length) {
|
|
return -1;
|
|
}
|
|
if (start < 0) {
|
|
start = Math.max(0, source.length + start);
|
|
}
|
|
const s = needle[0];
|
|
for (let i = start; i < source.length; i++) {
|
|
if (source[i] !== s) continue;
|
|
const pin = i;
|
|
let matched = 1;
|
|
let j = i;
|
|
while (matched < needle.length) {
|
|
j++;
|
|
if (source[j] !== needle[j - pin]) {
|
|
break;
|
|
}
|
|
matched++;
|
|
}
|
|
if (matched === needle.length) {
|
|
return pin;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|