Module: JSONAPI::Support::Sort::Compare

Defined in:
lib/json_api/support/sort/compare.rb

Overview

Compares two values for stable sort ordering. Ruby 3.4+ TrueClass#<=> returns nil when operands differ (true <=> false), so booleans are normalized before <=>.

Class Method Summary collapse

Class Method Details

.comparable(value) ⇒ Object



20
21
22
23
24
# File 'lib/json_api/support/sort/compare.rb', line 20

def comparable(value)
  return value ? 1 : 0 if value in TrueClass | FalseClass

  value
end

.compare(value_a, value_b) ⇒ Object



11
12
13
14
15
16
17
18
# File 'lib/json_api/support/sort/compare.rb', line 11

def compare(value_a, value_b)
  return 0 if value_a.nil? && value_b.nil?
  return -1 if value_a.nil?
  return  1 if value_b.nil?

  comparable(value_a) <=> comparable(value_b) ||
    raise_incomparable(value_a, value_b)
end

.raise_incomparable(value_a, value_b) ⇒ Object

Raises:

  • (ArgumentError)


26
27
28
29
# File 'lib/json_api/support/sort/compare.rb', line 26

def raise_incomparable(value_a, value_b)
  detail = "#{value_a.class.name} (#{value_a.inspect}), #{value_b.class.name} (#{value_b.inspect})"
  raise ArgumentError, "incomparable sort values: #{detail}"
end