module Unaccent

def unaccent(str)

def unaccent(str)
  via_gsub(str)
end

def via_each_char(str)

def via_each_char(str)
  return str if str.ascii_only?
  res = ''; str.each_char { |c| res << ACCENTMAP.fetch(c, c) }; res
end

def via_gsub(str)

def via_gsub(str)
  return str if str.ascii_only?
  str.gsub(/[^[:ascii:]]/) { |c| ACCENTMAP.fetch(c, c) }
end

def via_scan(str)

def via_scan(str)
  return str if str.ascii_only?
  res = ''; str.scan(/./) { |c| res << ACCENTMAP.fetch(c, c) }; res
end

def via_split_map(str)

def via_split_map(str)
  return str if str.ascii_only?
  str.split(//u).map { |c| ACCENTMAP.fetch(c, c) }.join
end