public long binaryFind(Func f)
{
object[] values = this.m_values;
int low = 0, high = m_size-1;
bool oneArg = f.arity() == 1;
while (low <= high)
{
int probe = (low + high) >> 1;
object val = values[probe];
object res = oneArg ? f.call(val) : f.call(val, Long.valueOf(probe));
long cmp = ((Long)res).longValue();
if (cmp > 0)
low = probe + 1;
else if (cmp < 0)
high = probe - 1;
else
return probe;
}
return -(low + 1);
}