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 /mrbgems/mruby-enum-ext/mrblib/enum.rb | |
| parent | 2c44f96e78832dd42e35a9cae6e90dccaf5c2178 (diff) | |
| download | mruby-44763ebc749518693ae85b59c8e22cfe8ba8819f.tar.gz mruby-44763ebc749518693ae85b59c8e22cfe8ba8819f.zip | |
Add Enumerable#{flat_map,collect_concat}
Diffstat (limited to 'mrbgems/mruby-enum-ext/mrblib/enum.rb')
| -rw-r--r-- | mrbgems/mruby-enum-ext/mrblib/enum.rb | 30 |
1 files changed, 30 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 |
