summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-range-ext/mrblib
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2019-07-09 18:44:53 +0900
committerGitHub <[email protected]>2019-07-09 18:44:53 +0900
commit59a76d48f878c74be2d45a2024ba287cf3c5c003 (patch)
treeb3248d88dc2e534cd753527b918194b14a4818c0 /mrbgems/mruby-range-ext/mrblib
parent9add4a66c0cccf0f9ce738ea5dda4d8e960fff7b (diff)
parent3b77b5fd394f9c9ba841e7bea8ea62dc6e8a3a1b (diff)
downloadmruby-59a76d48f878c74be2d45a2024ba287cf3c5c003.tar.gz
mruby-59a76d48f878c74be2d45a2024ba287cf3c5c003.zip
Merge pull request #4560 from lopopolo/range-max-min-hang
Specialize Enumerable#max and Enumerable#min for Range
Diffstat (limited to 'mrbgems/mruby-range-ext/mrblib')
-rw-r--r--mrbgems/mruby-range-ext/mrblib/range.rb39
1 files changed, 39 insertions, 0 deletions
diff --git a/mrbgems/mruby-range-ext/mrblib/range.rb b/mrbgems/mruby-range-ext/mrblib/range.rb
index de7925ba7..a149a57dc 100644
--- a/mrbgems/mruby-range-ext/mrblib/range.rb
+++ b/mrbgems/mruby-range-ext/mrblib/range.rb
@@ -25,4 +25,43 @@ class Range
end
ary
end
+
+ def max(&block)
+ val = self.first
+ last = self.last
+ return super if block
+
+ # fast path for numerics
+ if (val.kind_of?(Fixnum) || val.kind_of?(Float)) && (last.kind_of?(Fixnum) || last.kind_of?(Float))
+ raise TypeError if exclude_end? && !last.kind_of?(Fixnum)
+ return nil if val > last
+ return nil if val == last && exclude_end?
+
+ max = last
+ max -= 1 if exclude_end?
+ return max
+ end
+
+ # delegate to Enumerable
+ super
+ end
+
+ def min(&block)
+ val = self.first
+ last = self.last
+ return super if block
+
+ # fast path for numerics
+ if (val.kind_of?(Fixnum) || val.kind_of?(Float)) && (last.kind_of?(Fixnum) || last.kind_of?(Float))
+ raise TypeError if exclude_end? && !last.kind_of?(Fixnum)
+ return nil if val > last
+ return nil if val == last && exclude_end?
+
+ min = val
+ return min
+ end
+
+ # delegate to Enumerable
+ super
+ end
end