class Vernier::Output::Firefox::Categorizer

def add_category(name:, **kw)

def add_category(name:, **kw)
  category = Category.new(@categories.length, name: name, **kw)
  @categories << category
  @categories_by_name[name] = category
  category.add_subcategory(name: "Other")
  yield category if block_given?
  category
end

def categorize(path)

def categorize(path)
  @categories.detect { |category| category.matches?(path) } || @categories.first
end

def gem_path(*names)

def gem_path(*names)
  %r{\A#{Regexp.union(Gem.path)}/gems/#{Regexp.union(names)}}
end

def get_category(name)

def get_category(name)
  @categories_by_name[name]
end

def initialize

def initialize
  @categories = []
  @categories_by_name = {}
  add_category(name: "Ruby", color: "grey") do |c|
    rails_components = %w[ activesupport activemodel activerecord
      actionview actionpack activejob actionmailer actioncable
      activestorage actionmailbox actiontext railties ]
    c.add_subcategory(
      name: "Rails",
      matcher: gem_path(*rails_components)
    )
    c.add_subcategory(
      name: "gem",
      matcher: starts_with(*Gem.path)
    )
    c.add_subcategory(
      name: "stdlib",
      matcher: starts_with(RbConfig::CONFIG["rubylibdir"])
    )
  end
  add_category(name: "Idle", color: "transparent")
  add_category(name: "Stalled", color: "transparent")
  add_category(name: "GC", color: "red")
  add_category(name: "cfunc", color: "yellow", matcher: "<cfunc>")
  add_category(name: "Thread", color: "grey")
end

def starts_with(*paths)

def starts_with(*paths)
  %r{\A#{Regexp.union(paths)}}
end