class Dry::Core::Equalizer
Define equality, equivalence and inspection methods
def define_cmp_method
- 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:)
- 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
- 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)
- 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)
- Api: - private
Returns:
-
(self)
-
Parameters:
-
descendant
(Module
) --
def included(descendant) super descendant.include Methods end
def initialize(*keys, **options)
- 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