module RDoc::RI::Paths

def self.each system, site, home, gems, *extra_dirs # :yields: directory, type

:yields: directory, type
def self.each system, site, home, gems, *extra_dirs # :yields: directory, type
  extra_dirs.each do |dir|
    yield dir, :extra
  end
  yield SYSDIR,  :system if system
  yield SITEDIR, :site   if site
  yield HOMEDIR, :home   if home
  gemdirs.each do |dir|
    yield dir, :gem
  end if gems
  nil
end

def self.gemdirs

def self.gemdirs
  return @gemdirs if @gemdirs
  require 'rubygems' unless defined?(Gem)
  # HACK dup'd from Gem.latest_partials and friends
  all_paths = []
  all_paths = Gem.path.map do |dir|
    Dir[File.join(dir, 'doc', '*', 'ri')]
  end.flatten
  ri_paths = {}
  all_paths.each do |dir|
    base = File.basename File.dirname(dir)
    if base =~ /(.*)-((\d+\.)*\d+)/ then
      name, version = $1, $2
      ver = Gem::Version.new version
      if ri_paths[name].nil? or ver > ri_paths[name][0] then
        ri_paths[name] = [ver, dir]
      end
    end
  end
  @gemdirs = ri_paths.map { |k,v| v.last }.sort
rescue LoadError
  @gemdirs = []
end

def self.path(system, site, home, gems, *extra_dirs)

def self.path(system, site, home, gems, *extra_dirs)
  path = raw_path system, site, home, gems, *extra_dirs
  path.select { |directory| File.directory? directory }
end

def self.raw_path(system, site, home, gems, *extra_dirs)

def self.raw_path(system, site, home, gems, *extra_dirs)
  path = []
  each(system, site, home, gems, *extra_dirs) do |dir, type|
    path << dir
  end
  path.compact
end