blob: b78b2deaadb7a95037dca46ca9e32040b77720ef (
plain) (
tree)
|
|
require 'active_support/concern'
require 'active_support/core_ext/module/aliasing'
require 'active_support/core_ext/object/try'
module InfiniteComparable
extend ActiveSupport::Concern
included do
alias_method_chain :<=>, :infinity
end
define_method :'<=>_with_infinity' do |other|
if other.class == self.class
public_send :'<=>_without_infinity', other
else
infinite = try(:infinite?)
other_infinite = other.try(:infinite?)
# inf <=> inf
if infinite && other_infinite
infinite <=> other_infinite
# not_inf <=> inf
elsif other_infinite
-other_infinite
# inf <=> not_inf
elsif infinite
infinite
else
conversion = "to_#{self.class.name.downcase}"
other = other.public_send(conversion) if other.respond_to?(conversion)
public_send :'<=>_without_infinity', other
end
end
end
end
|