compileSearch = (funcName, predicate, reversed, extraArgs, earlyOut) => {
	const code = [
		"function ",
		funcName,
		"(a,l,h,",
		extraArgs.join(","),
		"){",
		earlyOut ? "" : "var i=",
		reversed ? "l-1" : "h+1",
		";while(l<=h){var m=(l+h)>>>1,x=a[m]"
	];

	if (earlyOut) {
		if (!predicate.includes("c")) {
			code.push(";if(x===y){return m}else if(x<=y){");
		} else {
			code.push(";var p=c(x,y);if(p===0){return m}else if(p<=0){");
		}
	} else {
		code.push(";if(", predicate, "){i=m;");
	}
	if (reversed) {
		code.push("l=m+1}else{h=m-1}");
	} else {
		code.push("h=m-1}else{l=m+1}");
	}
	code.push("}");
	if (earlyOut) {
		code.push("return -1};");
	} else {
		code.push("return i};");
	}
	return code.join("");
}
Helper function for compiling binary search functions.

The generated code uses a while loop to repeatedly divide the search interval
in half until the desired element is found, or the search interval is empty.

The following is an example of a generated function for calling `compileSearch("P", "c(x,y)<=0", true, ["y", "c"], false)`:

```js
function P(a,l,h,y,c){var i=l-1;while(l<=h){var m=(l+h)>>>1,x=a[m];if(c(x,y)<=0){i=m;l=m+1}else{h=m-1}}return i};
```
@param {string} funcName The name of the function to be compiled.
@param {string} predicate The predicate / comparison operator to be used in the binary search.
@param {boolean} reversed Whether the search should be reversed.
@param {string[]} extraArgs Extra arguments to be passed to the function.
@param {boolean=} earlyOut Whether the search should return as soon as a match is found.
@returns {string} The compiled binary search function.