#--
# Credits for original version goes to Zallus Kanite and Gavin Sinclair.
#++

#--
# Hash#graph! is only useful for Hash. It is not generally
# applicable to Enumerable.
#++

require 'facets/core/hash/graph'

module Enumerable

  # Like <tt>#map</tt>/<tt>#collect</tt>, but it generates a Hash.  The block
  # is expected to return two values: the key and the value for the new hash.
  #
  #   numbers  = (1..3)
  #   squares  = numbers.graph { |n| [n, n*n] }   # { 1=>1, 2=>4, 3=>9 }
  #   sq_roots = numbers.graph { |n| [n*n, n] }   # { 1=>1, 4=>2, 9=>3 }
  #

  def graph(&yld)
    if yld
      inject({}) do |h,kv|
        nk, nv = yld[*kv]
        h[nk] = nv
        h
      end
    else
      Hash[*self.to_a.flatten]
    end
  end

end



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

  require 'test/unit'

  class TestEnumerable < Test::Unit::TestCase

    def test_graph
      numbers  = (1..3)
      squares  = numbers.graph{ |n| [n, n*n] }
      assert_equal( {1=>1, 2=>4, 3=>9}, squares )
      sq_roots = numbers.graph{ |n| [n*n, n] }
      assert_equal( {1=>1, 4=>2, 9=>3}, sq_roots )
    end

  end

=end
