mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Enumerable#minmax_by
This commit is contained in:
@@ -374,4 +374,43 @@ module Enumerable
|
||||
end
|
||||
[min, max]
|
||||
end
|
||||
|
||||
##
|
||||
# call-seq:
|
||||
# enum.minmax_by { |obj| block } -> [min, max]
|
||||
# enum.minmax_by -> an_enumerator
|
||||
#
|
||||
# Returns a two element array containing the objects in
|
||||
# <i>enum</i> that correspond to the minimum and maximum values respectively
|
||||
# from the given block.
|
||||
#
|
||||
# If no block is given, an enumerator is returned instead.
|
||||
#
|
||||
# %w(albatross dog horse).minmax_by { |x| x.length } #=> ["dog", "albatross"]
|
||||
|
||||
def minmax_by(&block)
|
||||
max = nil
|
||||
max_cmp = nil
|
||||
min = nil
|
||||
min_cmp = nil
|
||||
first = true
|
||||
|
||||
self.each do |val|
|
||||
if first
|
||||
max = min = val
|
||||
max_cmp = min_cmp = block.call(val)
|
||||
first = false
|
||||
else
|
||||
if (cmp = block.call(val)) > max_cmp
|
||||
max = val
|
||||
max_cmp = cmp
|
||||
end
|
||||
if (cmp = block.call(val)) < min_cmp
|
||||
min = val
|
||||
min_cmp = cmp
|
||||
end
|
||||
end
|
||||
end
|
||||
[min, max]
|
||||
end
|
||||
end
|
||||
|
||||
@@ -90,3 +90,7 @@ assert("Enumerable#minmax") do
|
||||
assert_equal ["albatross", "horse"], a.minmax
|
||||
assert_equal ["dog", "albatross"], a.minmax { |a, b| a.length <=> b.length }
|
||||
end
|
||||
|
||||
assert("Enumerable#minmax_by") do
|
||||
assert_equal ["dog", "albatross"], %w(albatross dog horse).minmax_by { |x| x.length }
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user