Skip to content

jeremywrnr/deepmap

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

deepmap

Gem Version MIT

setup

[sudo] gem install deepmap

about

Ruby gem that adds three methods to the Hash and Array classes. Overview:

  • #deep_map - apply block to each key and value in object
  • #key_map - apply block to each key in object
  • #val_map - apply block to each value in object

These may be useful when you want to apply a function to each value (or key or pair) of a complex nested object (such as the result of parsing a YAML or JSON file), which can have hashes or arrays as subfields. The function currently needs to be passed in as a block (see usage).

usage

irb(main):001:0> require 'deepmap'
=> true

irb(main):002:0> test = { 1 => 4, 2 => [5, 6], 3 => { 4 => [1, 2, { 5 => 10 }] } }
=> {1=>4, 2=>[5, 6], 3=>{4=>[1, 2, {5=>10}]}}

irb(main):003:0> test.deep_map {|i| i.to_i * 2 }
=> {2=>8, 4=>[10, 12], 6=>{8=>[2, 4, {10=>20}]}}

irb(main):004:0> test.key_map {|i| i.to_i * 2 }
=> {2=>4, 4=>[5, 6], 6=>{8=>[1, 2, {10=>10}]}}

irb(main):005:0> test.val_map {|i| i.to_i * 2 }
=> {1=>8, 2=>[10, 12], 3=>{4=>[2, 4, {5=>20}]}}

Once you require 'deepmap', you can call any of the three provided functions on any (existing or new!) hash or array, as demonstrated above. You can also use the (&:method) shortcut to call a method on each object concisely:

irb(main):002:0> test = { 'a' => 'b', 'c' => ['d', 'e'], 'f' => { 'g' => ['h', 'i', { 'j' => 'k' }] } }
=> {"a"=>"b", "c"=>["d", "e"], "f"=>{"g"=>["h", "i", {"j"=>"k"}]}}

irb(main):003:0> test.deep_map(&:upcase)
=> {"A"=>"B", "C"=>["D", "E"], "F"=>{"G"=>["H", "I", {"J"=>"K"}]}}

irb(main):004:0> test.key_map(&:upcase)
=> {"A"=>"b", "C"=>["d", "e"], "F"=>{"G"=>["h", "i", {"J"=>"k"}]}}

irb(main):005:0> test.val_map(&:upcase)
=> {"a"=>"B", "c"=>["D", "E"], "f"=>{"g"=>["H", "I", {"j"=>"K"}]}}

development / testing

First, clone this repo:

git clone https://github.com/jeremywrnr/deepmap.git

To build from source, first install the project dependencies. This project uses bundler, the standard ruby gem management system. If you don't have it, try running gem install bundler. Once that is done:

bundle install

Now, we should be able to build the gem locally. This will build the local deepmap gem and link it in your path, so you can playing around with deepmap.

bundle exec rake build

This uses rspec and rake to run a suite of unit tests. To run the suite:

bundle exec rake

todo

  • collison checking/warning/confirmation workflow
  • support key-val iteration in mapping over vals/keys. This would allow support for mapping conditionally based on a key/value, even if you are iterating over all values/keys (key_map {|k, v| k > 0 ? k : v }).

Releases

No releases published

Packages

No packages published

Languages