diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2019-07-09 18:44:53 +0900 |
|---|---|---|
| committer | GitHub <[email protected]> | 2019-07-09 18:44:53 +0900 |
| commit | 59a76d48f878c74be2d45a2024ba287cf3c5c003 (patch) | |
| tree | b3248d88dc2e534cd753527b918194b14a4818c0 /mrbgems/mruby-range-ext/mrblib | |
| parent | 9add4a66c0cccf0f9ce738ea5dda4d8e960fff7b (diff) | |
| parent | 3b77b5fd394f9c9ba841e7bea8ea62dc6e8a3a1b (diff) | |
| download | mruby-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.rb | 39 |
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 |
