summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-enum-ext
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-03-22 16:55:47 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-03-22 16:55:47 +0900
commit22d57105eb814de6117c7d819711a90a8129a56c (patch)
tree38b1d6244ece65cfa236fad8ea155b9433a4306d /mrbgems/mruby-enum-ext
parent04b5e705e0004a3321b900c7c40ec513f79a5fcb (diff)
downloadmruby-22d57105eb814de6117c7d819711a90a8129a56c.tar.gz
mruby-22d57105eb814de6117c7d819711a90a8129a56c.zip
add Enumerable#min_by as well; ref #1912
Diffstat (limited to 'mrbgems/mruby-enum-ext')
-rw-r--r--mrbgems/mruby-enum-ext/mrblib/enum.rb34
-rw-r--r--mrbgems/mruby-enum-ext/test/enum.rb4
2 files changed, 38 insertions, 0 deletions
diff --git a/mrbgems/mruby-enum-ext/mrblib/enum.rb b/mrbgems/mruby-enum-ext/mrblib/enum.rb
index aea2f83c7..1849ff4cd 100644
--- a/mrbgems/mruby-enum-ext/mrblib/enum.rb
+++ b/mrbgems/mruby-enum-ext/mrblib/enum.rb
@@ -301,4 +301,38 @@ module Enumerable
end
max
end
+
+ ##
+ # call-seq:
+ # enum.min_by {|obj| block } -> obj
+ # enum.min_by -> an_enumerator
+ #
+ # Returns the object in <i>enum</i> that gives the minimum
+ # value from the given block.
+ #
+ # If no block is given, an enumerator is returned instead.
+ #
+ # %w[albatross dog horse].min_by {|x| x.length } #=> "dog"
+
+ def min_by(&block)
+ return to_enum :min_by unless block_given?
+
+ first = true
+ min = nil
+ min_cmp = nil
+
+ self.each do |*val|
+ if first
+ min = val.__svalue
+ min_cmp = block.call(*val)
+ first = false
+ else
+ if (cmp = block.call(*val)) < min_cmp
+ min = val.__svalue
+ min_cmp = cmp
+ end
+ end
+ end
+ min
+ end
end
diff --git a/mrbgems/mruby-enum-ext/test/enum.rb b/mrbgems/mruby-enum-ext/test/enum.rb
index bca1fc4f6..ba0851582 100644
--- a/mrbgems/mruby-enum-ext/test/enum.rb
+++ b/mrbgems/mruby-enum-ext/test/enum.rb
@@ -80,3 +80,7 @@ end
assert("Enumerable#max_by") do
assert_equal "albatross", %w[albatross dog horse].max_by { |x| x.length }
end
+
+assert("Enumerable#min_by") do
+ assert_equal "dog", %w[albatross dog horse].min_by { |x| x.length }
+end