summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-enum-ext/mrblib/enum.rb
diff options
context:
space:
mode:
authorJun Hiroe <[email protected]>2014-03-22 21:52:08 +0900
committerJun Hiroe <[email protected]>2014-03-22 21:52:08 +0900
commit5027aaaf4e3d0ca8d64e15b704b20d92973db258 (patch)
tree76676667580d0bda1e41c8a159ff4e852d2e76d3 /mrbgems/mruby-enum-ext/mrblib/enum.rb
parent7182ef6358f0bdebfd1f949f89b8840e2042a394 (diff)
downloadmruby-5027aaaf4e3d0ca8d64e15b704b20d92973db258.tar.gz
mruby-5027aaaf4e3d0ca8d64e15b704b20d92973db258.zip
Add Enumerable#minmax
Diffstat (limited to 'mrbgems/mruby-enum-ext/mrblib/enum.rb')
-rw-r--r--mrbgems/mruby-enum-ext/mrblib/enum.rb37
1 files changed, 37 insertions, 0 deletions
diff --git a/mrbgems/mruby-enum-ext/mrblib/enum.rb b/mrbgems/mruby-enum-ext/mrblib/enum.rb
index 1849ff4cd..2f6c4dbbc 100644
--- a/mrbgems/mruby-enum-ext/mrblib/enum.rb
+++ b/mrbgems/mruby-enum-ext/mrblib/enum.rb
@@ -335,4 +335,41 @@ module Enumerable
end
min
end
+
+ ##
+ # call-seq:
+ # enum.minmax -> [min, max]
+ # enum.minmax { |a, b| block } -> [min, max]
+ #
+ # Returns two elements array which contains the minimum and the
+ # maximum value in the enumerable. The first form assumes all
+ # objects implement <code>Comparable</code>; the second uses the
+ # block to return <em>a <=> b</em>.
+ #
+ # a = %w(albatross dog horse)
+ # a.minmax #=> ["albatross", "horse"]
+ # a.minmax { |a, b| a.length <=> b.length } #=> ["dog", "albatross"]
+
+ def minmax(&block)
+ max = nil
+ min = nil
+ first = true
+
+ self.each do |val|
+ if first
+ max = val
+ min = val
+ first = false
+ else
+ if block
+ max = val if block.call(val, max) > 0
+ min = val if block.call(val, min) < 0
+ else
+ max = val if (val <=> max) > 0
+ min = val if (val <=> min) < 0
+ end
+ end
+ end
+ [min, max]
+ end
end