From d5c60214c45bafc1cf2a516f852394986f9c84bb Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Fri, 7 Jun 2019 22:03:02 -0700 Subject: Implement Range#minmax Range#minmax was previous not implemented, so calling #minmax on range was actually calling Enumerable#minmax. This is a simple implementation of #minmax by just calling range_min and range_max. Fixes [Bug #15867] Fixes [Bug #15807] --- range.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'range.c') diff --git a/range.c b/range.c index e8515e0b8a..69f73c0406 100644 --- a/range.c +++ b/range.c @@ -1211,6 +1211,27 @@ range_max(int argc, VALUE *argv, VALUE range) } } +/* + * call-seq: + * rng.minmax -> [obj, obj] + * rng.minmax {| a,b | block } -> [obj, obj] + * + * Returns a two element array which contains the minimum and the + * maximum value in the range. + * + * Can be given an optional block to override the default comparison + * method a <=> b. + */ + +static VALUE +range_minmax(VALUE range) +{ + if (rb_block_given_p()) { + return rb_call_super(0, NULL); + } + return rb_assoc_new(range_min(0, NULL, range), range_max(0, NULL, range)); +} + int rb_range_values(VALUE range, VALUE *begp, VALUE *endp, int *exclp) { @@ -1697,6 +1718,7 @@ Init_Range(void) rb_define_method(rb_cRange, "last", range_last, -1); rb_define_method(rb_cRange, "min", range_min, -1); rb_define_method(rb_cRange, "max", range_max, -1); + rb_define_method(rb_cRange, "minmax", range_minmax, 0); rb_define_method(rb_cRange, "size", range_size, 0); rb_define_method(rb_cRange, "to_a", range_to_a, 0); rb_define_method(rb_cRange, "entries", range_to_a, 0); -- cgit v1.2.3