module Rekey
Constants
- VERSION
Public Instance Methods
rekey(enumerable, key_handle = nil, value_handle = nil, &block)
click to toggle source
# File lib/rekey/rekey.rb, line 7 def rekey(enumerable, key_handle = nil, value_handle = nil, &block) validate_input key_handle, value_handle, &block key_value_fn = if enumerable.respond_to?(:keys) proc {|k, v| [k, v]} else proc {|v| [nil, v]} end # rekey input enumerable.each_with_object({}) do |*args, res| key, value = key_value_fn.call *args new_key = key new_value = value if block if block.arity < 2 # block only wants value # arity -1 is a function pointer, eg. &:to_i new_key = block.call value else # block wants both key and value if key_value_fn.arity != 2 raise ArgumentError.new( 'rekey block requests key/value pair but only value available' ) end new_key = block.call key, value end else new_key = PluckIt.pluckit value, key_handle new_value = PluckIt.pluckit value, value_handle if value_handle end # collect results res[new_key] = new_value end end
Private Instance Methods
validate_input(key_handle, value_handle, &block)
click to toggle source
# File lib/rekey/rekey.rb, line 51 def validate_input key_handle, value_handle, &block if block if (key_handle or value_handle) raise ArgumentError.new 'expected key / value handles, *or* block' end elsif key_handle.nil? raise ArgumentError.new 'key handle or block required' end end