module Enumerable

Public Instance Methods

sort_by_alphanum() { |a| ... } click to toggle source
# File lib/roqua/core_ext/enumerable/sort_by_alphanum.rb, line 2
def sort_by_alphanum
  sort do |a, b|
    if block_given?
      grouped_compare(yield(a), yield(b))
    else
      grouped_compare(a, b)
    end
  end
end
sort_by_alphanum!() { |a| ... } click to toggle source
# File lib/roqua/core_ext/enumerable/sort_by_alphanum.rb, line 12
def sort_by_alphanum!
  sort! do |a, b|
    if block_given?
      grouped_compare(yield(a), yield(b))
    else
      grouped_compare(a, b)
    end
  end
end

Private Instance Methods

extract_alpha_or_number_group(item) click to toggle source
# File lib/roqua/core_ext/enumerable/sort_by_alphanum.rb, line 40
def extract_alpha_or_number_group(item)
  matchdata = /([A-Za-z]+|[\d]+)/.match(item)

  if matchdata.nil?
    ["", ""]
  else
    [matchdata[0], item = item[matchdata.offset(0)[1] .. -1]]
  end
end
grouped_compare(a, b) click to toggle source
# File lib/roqua/core_ext/enumerable/sort_by_alphanum.rb, line 24
def grouped_compare(a, b)
  loop {
    a_chunk, a = extract_alpha_or_number_group(a)
    b_chunk, b = extract_alpha_or_number_group(b)

    ret = if a_chunk =~ /\d/ and b_chunk =~ /\d/
            a_chunk.to_i <=> b_chunk.to_i
          else
            a_chunk <=> b_chunk
          end

    return -1 if a_chunk == ''
    return ret if ret != 0
  }
end