From 5027aaaf4e3d0ca8d64e15b704b20d92973db258 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Sat, 22 Mar 2014 21:52:08 +0900 Subject: Add Enumerable#minmax --- mrbgems/mruby-enum-ext/mrblib/enum.rb | 37 +++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'mrbgems/mruby-enum-ext/mrblib/enum.rb') 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 Comparable; the second uses the + # block to return a <=> b. + # + # 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 -- cgit v1.2.3