19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
# File 'lib/xenum/merge_sort.rb', line 19
def iter(*enums)
Enumerator.new do |yielder|
enums = enums.each_with_object([]) do |e, arr|
c = Candidate.new(e)
arr << c if c.value != NULL
end
enums.sort!{ |a, b| b <=> a }
resort = -> do
i = -1
x = enums[i]
loop do
e = enums[i-1]
break unless e
break if (e <=> x) >= 0
enums[i] = e
i -= 1
end
enums[i] = x
end
loop do
break if enums.empty?
resort.call
least = enums[-1]
yielder << least.value
least.fetch
next enums.pop if least.value == NULL
end
end
end
|