Sha256: 7bf06a7bb97c405e1bdab968c5ec854818543d0efcc89f9811af2eb2d4b4ba25

Contents?: true

Size: 1.55 KB

Versions: 26

Compression:

Stored size: 1.55 KB

Contents

module Enumerable

  # Returns all items that are equal in terms of the supplied block.
  # If no block is given objects are considered to be equal if they return the
  # same value for Object#hash and if obj1 == obj2.
  # No guarantee about the order of the elements in the resulting array is made.
  #
  # Note: The result will be an array if you supply no block and a hash otherwise.
  #
  #   [1, 2, 2, 3, 4, 4].commonality # => { 2 => [2], 4 => [4] }
  #
  #   ["foo", "bar", "a"].commonality { |str| str.length }
  #   # => { 2 => ["foo, "bar"] }
  #
  #   # Returns all persons that share their last name with another person.
  #   persons.collisions { |person| person.last_name }
  #
  #--
  # Credit goes to Florian Gross
  #++
  def commonality( &block )
    had_no_block = !block
    block ||= lambda { |item| item }
    result = Hash.new { |hash, key| hash[key] = Array.new }
    self.each do |item|
      key = block.call(item)
      result[key] << item
    end
    result.reject! do |key, values|
      values.size <= 1
    end
    #return had_no_block ? result.values.flatten : result
    return result
  end

end


#  _____         _
# |_   _|__  ___| |_
#   | |/ _ \/ __| __|
#   | |  __/\__ \ |_
#   |_|\___||___/\__|
#
=begin test

  require 'test/unit'

  class TCEnumerable < Test::Unit::TestCase

    def test_commonality
      a = [1,2,2,3,3,3]
      r = { 2 => [2,2], 3 => [3,3,3] }
      assert_equal( r, a.commonality )
      a = [1,2,2,3,3,3]
      r = {false=>[1, 2, 2], true=>[3, 3, 3]}
      assert_equal( r, a.commonality { |x| x > 2 } )
    end

  end

=end

Version data entries

26 entries across 26 versions & 1 rubygems

Version Path
facets-1.0.0 lib/facet/enumerable/commonality.rb
facets-0.9.0 lib/nano/enumerable/commonality.rb
facets-1.0.3 packages/core/lib/facet/enumerable/commonality.rb
facets-1.2.1 lib/facets/core/enumerable/commonality.rb
facets-1.2.0 lib/facets/core/enumerable/commonality.rb
facets-1.3.0 lib/facets/core/enumerable/commonality.rb
facets-1.1.0 lib/facet/enumerable/commonality.rb
facets-1.3.3 lib/facets/core/enumerable/commonality.rb
facets-1.3.1 lib/facets/core/enumerable/commonality.rb
facets-1.3.2 lib/facets/core/enumerable/commonality.rb
facets-1.4.2 lib/facets/core/enumerable/commonality.rb
facets-1.4.0 lib/facets/core/enumerable/commonality.rb
facets-1.4.1 lib/facets/core/enumerable/commonality.rb
facets-1.4.3 lib/facets/core/enumerable/commonality.rb
facets-1.4.4 lib/facets/core/enumerable/commonality.rb
facets-1.4.5 lib/facets/core/enumerable/commonality.rb
facets-1.7.0 lib/facets/core/enumerable/commonality.rb
facets-1.7.30 lib/facets/core/enumerable/commonality.rb
facets-1.7.38 lib/facets/core/enumerable/commonality.rb
facets-1.7.46 lib/facets/core/enumerable/commonality.rb