(function (exports) {
'use strict';
function id (val) { return val; }
function get (key) { return function (val) { return val[key]; }; }
/**
* Searches for specific element in a given array using
* the binary search algorithm.
* Time complexity: O(log N).
*
* @example
*
* var search = require('path-to-algorithms/src/searching/'+
* 'binarysearch').binarySearch;
* console.log(search([1, 2, 3, 4, 5], 4)); // 3
*
* @public
* @module searching/binarysearch
* @param {Array} array Input array.
* @param {Number} value Value of the element which index should be found.
* @returns {Number} Index of the element or -1 if not found.
*/
function binarySearch(array, value, key) {
key = !key ? id : typeof key === 'string' ? get(key) : key;
value = key(value);
var middle = Math.floor(array.length / 2);
var left = 0;
var right = array.length;
while (right >= left) {
var middleValue = key(array[middle]);
if (middleValue === value) {
return middle;
} else if (middleValue > value) {
right = middle - 1;
} else {
left = middle + 1;
}
middle = Math.floor((left + right) / 2);
}
return -1;
}
exports.binarySearch = binarySearch;
})(typeof window === 'undefined' ? module.exports : window);