diff options
| author | Jun Hiroe <[email protected]> | 2014-03-21 11:50:09 +0900 |
|---|---|---|
| committer | Jun Hiroe <[email protected]> | 2014-03-21 12:34:21 +0900 |
| commit | 44763ebc749518693ae85b59c8e22cfe8ba8819f (patch) | |
| tree | f7fafe8d6f35dc918ad18520090752d55ce7bfe9 | |
| parent | 2c44f96e78832dd42e35a9cae6e90dccaf5c2178 (diff) | |
| download | mruby-44763ebc749518693ae85b59c8e22cfe8ba8819f.tar.gz mruby-44763ebc749518693ae85b59c8e22cfe8ba8819f.zip | |
Add Enumerable#{flat_map,collect_concat}
| -rw-r--r-- | mrbgems/mruby-enum-ext/mrblib/enum.rb | 30 | ||||
| -rw-r--r-- | mrbgems/mruby-enum-ext/test/enum.rb | 6 |
2 files changed, 36 insertions, 0 deletions
diff --git a/mrbgems/mruby-enum-ext/mrblib/enum.rb b/mrbgems/mruby-enum-ext/mrblib/enum.rb index c0f0ea3f2..6413198d4 100644 --- a/mrbgems/mruby-enum-ext/mrblib/enum.rb +++ b/mrbgems/mruby-enum-ext/mrblib/enum.rb @@ -237,4 +237,34 @@ module Enumerable end count end + + ## + # call-seq: + # enum.flat_map { |obj| block } -> array + # enum.collect_concat { |obj| block } -> array + # enum.flat_map -> an_enumerator + # enum.collect_concat -> an_enumerator + # + # Returns a new array with the concatenated results of running + # <em>block</em> once for every element in <i>enum</i>. + # + # If no block is given, an enumerator is returned instead. + # + # [1, 2, 3, 4].flat_map { |e| [e, -e] } #=> [1, -1, 2, -2, 3, -3, 4, -4] + # [[1, 2], [3, 4]].flat_map { |e| e + [100] } #=> [1, 2, 100, 3, 4, 100] + def flat_map(&block) + return to_enum :flat_map unless block_given? + + ary = [] + self.each do |e| + e2 = block.call(e) + if e2.respond_to? :each + e2.each { |e3| ary.push(e3) } + else + ary.push(e2) + end + end + ary + end + alias collect_concat flat_map end diff --git a/mrbgems/mruby-enum-ext/test/enum.rb b/mrbgems/mruby-enum-ext/test/enum.rb index 065ef7f5f..9523b497e 100644 --- a/mrbgems/mruby-enum-ext/test/enum.rb +++ b/mrbgems/mruby-enum-ext/test/enum.rb @@ -60,3 +60,9 @@ assert("Enumerable#count") do assert_equal 2, a.count(2) assert_equal 3, a.count{|x| x % 2 == 0} end + +assert("Enumerable#flat_map") do + assert_equal [1, 2, 3, 4], [1, 2, 3, 4].flat_map { |e| e } + assert_equal [1, -1, 2, -2, 3, -3, 4, -4], [1, 2, 3, 4].flat_map { |e| [e, -e] } + assert_equal [1, 2, 100, 3, 4, 100], [[1, 2], [3, 4]].flat_map { |e| e + [100] } +end |
