diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-03-22 16:55:47 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-03-22 16:55:47 +0900 |
| commit | 22d57105eb814de6117c7d819711a90a8129a56c (patch) | |
| tree | 38b1d6244ece65cfa236fad8ea155b9433a4306d /mrbgems/mruby-enum-ext | |
| parent | 04b5e705e0004a3321b900c7c40ec513f79a5fcb (diff) | |
| download | mruby-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.rb | 34 | ||||
| -rw-r--r-- | mrbgems/mruby-enum-ext/test/enum.rb | 4 |
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 |
