#-- # 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