class Gem::Platform

def cpu_match(spec_platform, user_platform)

def cpu_match(spec_platform, user_platform)
  if spec_platform.cpu == user_platform.cpu
    0
  elsif spec_platform.cpu == "arm" && user_platform.cpu.to_s.start_with?("arm")
    0
  elsif spec_platform.cpu.nil? || spec_platform.cpu == "universal"
    1
  else
    2
  end
end

def generic(platform)

def generic(platform)
  return Gem::Platform::RUBY if platform.nil? || platform == Gem::Platform::RUBY
  GENERIC_CACHE[platform] ||= begin
    found = GENERICS.find do |match|
      platform === match
    end
    found || Gem::Platform::RUBY
  end
end

def os_match(spec_platform, user_platform)

def os_match(spec_platform, user_platform)
  if spec_platform.os == user_platform.os
    0
  else
    1
  end
end

def platform_specificity_match(spec_platform, user_platform)

def platform_specificity_match(spec_platform, user_platform)
  return -1 if spec_platform == user_platform
  return 1_000_000 if spec_platform.nil? || spec_platform == Gem::Platform::RUBY || user_platform == Gem::Platform::RUBY
  os_match(spec_platform, user_platform) +
    cpu_match(spec_platform, user_platform) * 10 +
    version_match(spec_platform, user_platform) * 100
end

def same_deps?(spec, exemplary_spec)

def same_deps?(spec, exemplary_spec)
  spec.required_ruby_version == exemplary_spec.required_ruby_version &&
    spec.required_rubygems_version == exemplary_spec.required_rubygems_version &&
    spec.dependencies.sort == exemplary_spec.dependencies.sort
end

def same_specificity?(platform, spec, exemplary_spec)

def same_specificity?(platform, spec, exemplary_spec)
  platform_specificity_match(spec.platform, platform) == platform_specificity_match(exemplary_spec.platform, platform)
end

def sort_and_filter_best_platform_match(matching, platform)

def sort_and_filter_best_platform_match(matching, platform)
  return matching if matching.one?
  exact = matching.select {|spec| spec.platform == platform }
  return exact if exact.any?
  sorted_matching = sort_best_platform_match(matching, platform)
  exemplary_spec = sorted_matching.first
  sorted_matching.take_while {|spec| same_specificity?(platform, spec, exemplary_spec) && same_deps?(spec, exemplary_spec) }
end

def sort_best_platform_match(matching, platform)

def sort_best_platform_match(matching, platform)
  matching.sort_by.with_index do |spec, i|
    [
      platform_specificity_match(spec.platform, platform),
      i, # for stable sort
    ]
  end
end

def version_match(spec_platform, user_platform)

def version_match(spec_platform, user_platform)
  if spec_platform.version == user_platform.version
    0
  elsif spec_platform.version.nil?
    1
  else
    2
  end
end