3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
# File 'lib/array/bsearch_index.rb', line 3
def bsearch_index
return to_enum(__method__) unless block_given?
from = 0
to = size - 1
satisfied = nil
while from <= to do
midpoint = (from + to).div(2)
cur_index = midpoint
result = yield(cur = self[midpoint])
case result
when Numeric
return cur_index if result == 0
result = result < 0
when true
satisfied = cur
satisfied_index = cur_index
when nil, false
else
raise TypeError, "wrong argument type #{result.class} (must be numeric, true, false or nil)"
end
if result
to = midpoint - 1
else
from = midpoint + 1
end
end
satisfied_index
end
|