Module: Flexr::Unicode::CaseFold

Defined in:
lib/flexr/unicode/case_fold.rb

Class Method Summary collapse

Class Method Details

.merge(ranges) ⇒ Object



34
35
36
37
38
39
40
41
42
# File 'lib/flexr/unicode/case_fold.rb', line 34

def merge(ranges)
  ranges.sort_by(&:first).each_with_object([]) do |range, result|
    if result.empty? || range.first > result.last.last + 1
      result << range.dup
    else
      result.last[1] = [result.last.last, range.last].max
    end
  end
end

.ranges(lo, hi) ⇒ Object



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