Method: DeepEnumerable#deep_intersect

Defined in:
lib/deep_enumerable.rb

#deep_intersect(other, &block) ⇒ Object

Describes the similarities between two DeepEnumerables.

Examples:

>> alice = {:name=>"alice", :age=>26}
>> bob   = {:name=>"bob",   :age=>26}
>> alice.deep_intersect(bob)
=> {:age=>26}

>> bob   = {:friends=>["alice","carol"]}
>> carol = {:friends=>["alice","bob"]}
>> bob.deep_intersect(carol)
=> {:friends=>["alice"]}

Returns:

  • a result of the same structure as the primary DeepEnumerable.



167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
# File 'lib/deep_enumerable.rb', line 167

def deep_intersect(other, &block)
  (shallow_keys + other.shallow_keys).each_with_object(empty) do |key, res|
    s_val = (self[key] rescue nil) #TODO don't rely on rescue
    o_val = (other[key] rescue nil)

    comparator = block || :==.to_proc

    if s_val.respond_to?(:deep_intersect) && o_val.respond_to?(:deep_intersect)
      int = s_val.deep_intersect(o_val, &block)
      res[key] = int if int.any?
    elsif comparator.call(s_val, o_val)
      res[key] = s_val
    end
  end
end