summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-enum-ext/mrblib/enum.rb
diff options
context:
space:
mode:
authorJun Hiroe <[email protected]>2014-03-22 13:46:53 +0900
committerJun Hiroe <[email protected]>2014-03-22 14:51:45 +0900
commitaf7db89aa3630264c64da638c6330160c99d94b8 (patch)
tree69dbb36d80af0129f3cd2d835aaf51fa48b4f3df /mrbgems/mruby-enum-ext/mrblib/enum.rb
parent7c82b9e1bfffa6b703dc2f4a161b01e37f9154bc (diff)
downloadmruby-af7db89aa3630264c64da638c6330160c99d94b8.tar.gz
mruby-af7db89aa3630264c64da638c6330160c99d94b8.zip
Add Enumerable#max_by
Diffstat (limited to 'mrbgems/mruby-enum-ext/mrblib/enum.rb')
-rw-r--r--mrbgems/mruby-enum-ext/mrblib/enum.rb35
1 files changed, 35 insertions, 0 deletions
diff --git a/mrbgems/mruby-enum-ext/mrblib/enum.rb b/mrbgems/mruby-enum-ext/mrblib/enum.rb
index d0e125850..e61062e3f 100644
--- a/mrbgems/mruby-enum-ext/mrblib/enum.rb
+++ b/mrbgems/mruby-enum-ext/mrblib/enum.rb
@@ -267,4 +267,39 @@ module Enumerable
ary
end
alias collect_concat flat_map
+
+ ##
+ # call-seq:
+ # enum.max_by {|obj| block } -> obj
+ # enum.max_by -> an_enumerator
+ #
+ # Returns the object in <i>enum</i> that gives the maximum
+ # value from the given block.
+ #
+ # If no block is given, an enumerator is returned instead.
+ #
+ # %w[albatross dog horse].max_by { |x| x.length } #=> "albatross"
+
+ def max_by(&block)
+ return to_enum :max_by unless block_given?
+
+ first = true
+ max = nil
+ max_cmp = nil
+
+ self.each do |val|
+ if first
+ max = val
+ max_cmp = block.call(val)
+ first = false
+ else
+ if cmp = block.call(val) > max_cmp
+ max = val
+ max_cmp = cmp
+ end
+ end
+ end
+
+ max
+ end
end