summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mrblib/range.rb66
1 files changed, 65 insertions, 1 deletions
diff --git a/mrblib/range.rb b/mrblib/range.rb
index 392cc2274..746cb322c 100644
--- a/mrblib/range.rb
+++ b/mrblib/range.rb
@@ -15,7 +15,8 @@ class Range
val = self.first
last = self.last
- if val.kind_of?(Fixnum) && last.kind_of?(Fixnum) # fixnums are special
+ # numerics are special
+ if (val.kind_of?(Fixnum) || val.kind_of?(Float)) && (last.kind_of?(Fixnum) || last.kind_of?(Float))
lim = last
lim += 1 unless exclude_end?
i = val
@@ -64,4 +65,67 @@ end
# ISO 15.2.14.3
class Range
include Enumerable
+
+ def max(&block)
+ val = self.first
+ last = self.last
+ # numerics are special
+ if (val.kind_of?(Fixnum) || val.kind_of?(Float)) && (last.kind_of?(Fixnum) || last.kind_of?(Float))
+ return nil if val > last
+ return nil if val == last && exclude_end?
+
+ max = last
+ max -= 1 if exclude_end?
+ max = val if block && block.call(val, last) > 0
+ return max
+ end
+
+ max = nil
+ each do |item|
+ max =
+ if max.nil?
+ item
+ elsif block && block.call(max, item) > 0
+ item
+ elsif item > max
+ item
+ else
+ max
+ end
+ end
+ max
+ end
+
+ def min(&block)
+ val = self.first
+ last = self.last
+
+ # numerics are special
+ if (val.kind_of?(Fixnum) || val.kind_of?(Float)) && (last.kind_of?(Fixnum) || last.kind_of?(Float))
+ return nil if val > last
+ return nil if val == last && exclude_end?
+
+ min = val
+ if block && block.call(val, last) > 0
+ min = last
+ min -= 1 if exclude_end?
+ end
+ return min
+ end
+
+ min = nil
+ each do |item|
+ min =
+ if min.nil?
+ item
+ elsif block && block.call(min, item) < 0
+ item
+ elsif item < min
+ item
+ else
+ min
+ end
+ end
+ min
+ end
end