class RuboCop::Cop::Performance::CompareWithBlock

array.sort_by { |a| a }
array.minmax_by(&:foo)
array.min_by(&:foo)
array.max_by(&:foo)
end
var.foo
array.sort_by do |var|
array.sort_by { |v| v.foo }
array.sort_by!(&:foo)
array.sort_by(&:foo)
# good
array.sort { |a, b| a <=> b }
array.minmax { |a, b| a.foo <=> b.foo }
array.min { |a, b| a.foo <=> b.foo }
array.max { |a, b| a.foo <=> b.foo }
array.sort! { |a, b| a.foo <=> b.foo }
array.sort { |a, b| a.foo <=> b.foo }
# bad
@example
This cop also checks ‘sort!`, `min`, `max` and `minmax` methods.
can be replaced by `sort_by(&:foo)`.
Identifies places where `sort { |a, b| a.foo <=> b.foo }`

def compare_range(send, node)

def compare_range(send, node)
  range_between(send.loc.selector.begin_pos, node.loc.end.end_pos)
end

def message(send, method, var_a, var_b, args)

rubocop:disable Metrics/MethodLength
def message(send, method, var_a, var_b, args)
  compare_method     = send.method_name
  replacement_method = REPLACEMENT[compare_method]
  if method == :[]
    key = args.first
    instead = " { |a| a[#{key.source}] }"
    str_a = "#{var_a}[#{key.source}]"
    str_b = "#{var_b}[#{key.source}]"
  else
    instead = "(&:#{method})"
    str_a = "#{var_a}.#{method}"
    str_b = "#{var_b}.#{method}"
  end
  format(MSG, compare_method: compare_method,
              replacement_method: replacement_method,
              instead: instead,
              var_a: var_a,
              var_b: var_b,
              str_a: str_a,
              str_b: str_b)
end

def on_block(node)

def on_block(node)
  compare?(node) do |send, var_a, var_b, body|
    replaceable_body?(body, var_a, var_b) do |method, args_a, args_b|
      return unless slow_compare?(method, args_a, args_b)
      range = compare_range(send, node)
      add_offense(range, message: message(send, method, var_a, var_b, args_a)) do |corrector|
        replacement = if method == :[]
                        "#{REPLACEMENT[send.method_name]} { |a| a[#{args_a.first.source}] }"
                      else
                        "#{REPLACEMENT[send.method_name]}(&:#{method})"
                      end
        corrector.replace(range, replacement)
      end
    end
  end
end

def slow_compare?(method, args_a, args_b)

def slow_compare?(method, args_a, args_b)
  return false unless args_a == args_b
  if method == :[]
    return false unless args_a.size == 1
    key = args_a.first
    return false unless %i[sym str int].include?(key.type)
  else
    return false unless args_a.empty?
  end
  true
end