export type BinarySearchPredicate = ( value: T, index: number, arr: T[] ) => boolean; /** * Searches for a value by predicate function. * @param arr The list of any values. * @param predicate Predicate function. * @returns Found index or -1. */ export function findIndex( arr: T[], predicate: BinarySearchPredicate ): number { let l = -1; let r = arr.length - 1; while (1 + l < r) { const mid = l + ((r - l) >> 1); const cmp = predicate(arr[mid], mid, arr); cmp ? (r = mid) : (l = mid); } return r; }