module Term::ANSIColor::Attribute::Underline

def underline(string = nil, color: nil, type: nil, &block)

def underline(string = nil, color: nil, type: nil, &block)
  code = {
    nil =>   4,
    default: '4:1',
    double:  '4:2',
    curly:   '4:3',
    dotted:  '4:4',
    dashed:  '4:5',
  }.fetch(type) { raise ArgumentError, "invalid line type" }
  if color
    a = Term::ANSIColor::Attribute[color]
    color_code =
      if rgb = a.ask_and_send(:to_rgb_triple).full?(:to_a)
        "\e[58;2;#{rgb * ?;}"
      else
        raise ArgumentError, "invalid color #{a&.name.inspect}"
      end
    code = "#{code}m#{color_code}"
  end
  apply_code(code, string, &block)
end