class Dry::Equalizer

Define equality, equivalence and inspection methods

Constants

VERSION

Gem version

Public Class Methods

new(*keys, **options) click to toggle source

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/equalizer.rb, line 24
def initialize(*keys, **options)
  @keys = keys.uniq
  define_methods(**options)
  freeze
end

Private Instance Methods

define_cmp_method() click to toggle source

Define an cmp? method based on the instance's values identified by keys

@return [undefined]

@api private

# File lib/dry/equalizer.rb, line 64
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_hash_method(immutable:) click to toggle source

Define a hash method based on the instance's values identified by keys

@return [undefined]

@api private

Calls superclass method
# File lib/dry/equalizer.rb, line 79
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_inspect_method() click to toggle source

Define an inspect method that reports the values of the instance's keys

@return [undefined]

@api private

# File lib/dry/equalizer.rb, line 101
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_methods(inspect: true, immutable: false) click to toggle source

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/equalizer.rb, line 53
def define_methods(inspect: true, immutable: false)
  define_cmp_method
  define_hash_method(immutable: immutable)
  define_inspect_method if inspect
end
included(descendant) click to toggle source

Hook called when module is included

@param [Module] descendant

the module or class including Equalizer

@return [self]

@api private

Calls superclass method
# File lib/dry/equalizer.rb, line 40
def included(descendant)
  super
  descendant.include Methods
end