#--
# Hash#graph! is only good for a Hash.
#++
require 'nano/hash/graph'
module Enumerable
# Like #map/#collect, 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 }
#
#--
# Credits for original version goes to Zallus Kanite and Gavin Sinclair.
#++
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
# no longer used
#alias_method( :build_hash, :graph )
#alias_method( :build_hash!, :graph! )
end
# _____ _
# |_ _|__ ___| |_
# | |/ _ \/ __| __|
# | | __/\__ \ |_
# |_|\___||___/\__|
#
=begin test
require 'test/unit'
class TCEnumerable < 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