# typed: strict
# frozen_string_literal: true

class String
  extend T::Sig

  sig { returns(String) }
  def underscore
    return self unless /[A-Z-]|::/.match?(self)

    word = to_s.gsub("::", "/")
    word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
    word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
    word.tr!("-", "_")
    word.downcase!
    word
  end
end