class Dry::Core::Equalizer

Define equality, equivalence and inspection methods

def define_cmp_method

Other tags:
    Api: - private

Returns:
  • (undefined) -
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

def define_hash_method(immutable:)

Other tags:
    Api: - private

Returns:
  • (undefined) -
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

def define_inspect_method

Other tags:
    Api: - private

Returns:
  • (undefined) -
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

def define_methods(inspect: true, immutable: false)

Other tags:
    Api: - private

Returns:
  • (undefined) -

Parameters:
  • immutable (Boolean) -- whether to memoize #hash method
  • inspect (Boolean) -- whether to define #inspect method
def define_methods(inspect: true, immutable: false)
  define_cmp_method
  define_hash_method(immutable: immutable)
  define_inspect_method if inspect
end

def included(descendant)

Other tags:
    Api: - private

Returns:
  • (self) -

Parameters:
  • descendant (Module) --
def included(descendant)
  super
  descendant.include Methods
end

def initialize(*keys, **options)

Other tags:
    Api: - private

Returns:
  • (undefined) -

Options Hash: (**options)
  • :immutable (Boolean) -- whether to memoize #hash method
  • :inspect (Boolean) -- whether to define #inspect method

Parameters:
  • options (Hash) --
  • keys (Array) --
def initialize(*keys, **options)
  super()
  @keys = keys.uniq
  define_methods(**options)
  freeze
end