summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-enum-ext
diff options
context:
space:
mode:
authorJun Hiroe <[email protected]>2014-03-21 11:50:09 +0900
committerJun Hiroe <[email protected]>2014-03-21 12:34:21 +0900
commit44763ebc749518693ae85b59c8e22cfe8ba8819f (patch)
treef7fafe8d6f35dc918ad18520090752d55ce7bfe9 /mrbgems/mruby-enum-ext
parent2c44f96e78832dd42e35a9cae6e90dccaf5c2178 (diff)
downloadmruby-44763ebc749518693ae85b59c8e22cfe8ba8819f.tar.gz
mruby-44763ebc749518693ae85b59c8e22cfe8ba8819f.zip
Add Enumerable#{flat_map,collect_concat}
Diffstat (limited to 'mrbgems/mruby-enum-ext')
-rw-r--r--mrbgems/mruby-enum-ext/mrblib/enum.rb30
-rw-r--r--mrbgems/mruby-enum-ext/test/enum.rb6
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