Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 10 additions & 13 deletions lib/dry/equalizer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class Equalizer < Module
#
# @api private
def initialize(*keys)
@keys = keys.uniq
@keys = keys
define_methods
freeze
end
Expand All @@ -45,20 +45,19 @@ def included(descendant)
#
# @api private
def define_methods
define_cmp_method
define_hash_method
define_inspect_method
define_cmp_method(@keys)
define_hash_method(@keys)
define_inspect_method(@keys)
end

# Define an #cmp? method based on the instance's values identified by #keys
#
# @return [undefined]
#
# @api private
def define_cmp_method
keys = @keys
def define_cmp_method(keys)
define_method(:cmp?) do |comparator, other|
keys.all? do |key|
keys.uniq.all? do |key|
__send__(key).public_send(comparator, other.__send__(key))
end
end
Expand All @@ -70,10 +69,9 @@ def define_cmp_method
# @return [undefined]
#
# @api private
def define_hash_method
keys = @keys
def define_hash_method(keys)
define_method(:hash) do | |
keys.map(&method(:send)).push(self.class).hash
keys.uniq.map(&method(:send)).push(self.class).hash
end
end

Expand All @@ -82,12 +80,11 @@ def define_hash_method
# @return [undefined]
#
# @api private
def define_inspect_method
keys = @keys
def define_inspect_method(keys)
define_method(:inspect) do | |
klass = self.class
name = klass.name || klass.inspect
"#<#{name}#{keys.map { |key| " #{key}=#{__send__(key).inspect}" }.join}>"
"#<#{name}#{keys.uniq.map { |key| " #{key}=#{__send__(key).inspect}" }.join}>"
end
end

Expand Down