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) @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 71 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 86 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 108 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 60 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 47 def included(descendant) super descendant.include Methods end