@extra-array/bsearch-any
Version:
Binary searches value in sorted array.
48 lines (43 loc) • 949 B
JavaScript
;
/**
* Gives same value.
* @param v a value
* @returns v
*/
function id(v) {
return v;
}
/**
* Compares two values.
* @param a a value
* @param b another value
* @returns a<b: -1, a=b: 0, a>b: 1
*/
function cmp(a, b) {
return a < b ? -1 : (a > b ? 1 : 0);
}
/**
* Binary searches value in sorted array.
* @param x an array (sorted)
* @param v search value
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns index of value | ~(index of closest value)
*/
function bsearchAny(x, v, fc = null, fm = null) {
var fc = fc || cmp, fm = fm || id;
var v1 = fm(v, 0, null);
for (var i = 0, I = x.length; i < I;) {
var m = i + I >>> 1;
var u1 = fm(x[m], m, x);
var c = fc(u1, v1);
if (c < 0)
i = m + 1;
else if (c > 0)
I = m;
else
return m;
}
return ~i;
}
module.exports = bsearchAny;