8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
# File 'lib/flexr/unicode/case_fold.rb', line 8
def ranges(lo, hi)
table = Data.const_defined?(:CASE_FOLD, false) ? Data::CASE_FOLD : {}
return [[lo, hi]] if table.empty?
points = {}
table.each do |point, folded|
next unless point.between?(lo, hi) || folded.between?(lo, hi)
points[point] = true
points[folded] = true
end
loop do
changed = false
table.each do |point, folded|
next unless points.key?(point) || points.key?(folded)
next if points.key?(point) && points.key?(folded)
points[point] = true
points[folded] = true
changed = true
end
break unless changed
end
merge([[lo, hi]] + points.keys.map { |point| [point, point] })
end
|