class Dry::Core::Equalizer
Define equality, equivalence and inspection methods
Public Class Methods
Initialize an Equalizer
with the given keys
Will use the keys with which it is initialized to define cmp?, hash, and inspect
@param [Array<Symbol>] keys @param [Hash] options @option options [Boolean] :inspect whether to define inspect method @option options [Boolean] :immutable whether to memoize hash method
@return [undefined]
@api private
# File lib/dry/core/equalizer.rb, line 31 def initialize(*keys, **options) super() @keys = keys.uniq define_methods(**options) freeze end
Private Instance Methods
Define an cmp? method based on the instance's values identified by keys
@return [undefined]
@api private
# File lib/dry/core/equalizer.rb, line 72 def define_cmp_method keys = @keys define_method(:cmp?) do |comparator, other| keys.all? do |key| __send__(key).public_send(comparator, other.__send__(key)) end end private :cmp? end
Define a hash method based on the instance's values identified by keys
@return [undefined]
@api private
# File lib/dry/core/equalizer.rb, line 87 def define_hash_method(immutable:) calculate_hash = ->(obj) { @keys.map { |key| obj.__send__(key) }.push(obj.class).hash } if immutable define_method(:hash) do @__hash__ ||= calculate_hash.call(self) end define_method(:freeze) do hash super() end else define_method(:hash) do calculate_hash.call(self) end end end
Define an inspect method that reports the values of the instance's keys
@return [undefined]
@api private
# File lib/dry/core/equalizer.rb, line 109 def define_inspect_method keys = @keys define_method(:inspect) do klass = self.class name = klass.name || klass.inspect "#<#{name}#{keys.map { |key| " #{key}=#{__send__(key).inspect}" }.join}>" end end
Define the equalizer methods based on keys
@param [Boolean] inspect whether to define inspect method @param [Boolean] immutable whether to memoize hash method
@return [undefined]
@api private
# File lib/dry/core/equalizer.rb, line 61 def define_methods(inspect: true, immutable: false) define_cmp_method define_hash_method(immutable: immutable) define_inspect_method if inspect end
Hook called when module is included
@param [Module] descendant
the module or class including Equalizer
@return [self]
@api private
# File lib/dry/core/equalizer.rb, line 48 def included(descendant) super descendant.include Methods end