mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
mruby-range-ext: update overlap? to handle empty ranges
The code is taken from ActiveSupport (Rails).
This commit is contained in:
@@ -102,6 +102,30 @@ class Range
|
||||
# (1..5).overlap?(7..9) # => false
|
||||
def overlap?(other)
|
||||
raise TypeError, "argument must be a range" unless other.kind_of?(Range)
|
||||
other.begin == self.begin || self.cover?(other.begin) || other.cover?(self.begin)
|
||||
|
||||
self_begin = self.begin
|
||||
other_end = other.end
|
||||
other_excl = other.exclude_end?
|
||||
|
||||
return false if __empty_range?(self_begin, other_end, other_excl)
|
||||
|
||||
other_begin = other.begin
|
||||
self_end = self.end
|
||||
self_excl = self.exclude_end?
|
||||
|
||||
return false if __empty_range?(other_begin, self_end, self_excl)
|
||||
return true if self_begin == other_begin
|
||||
|
||||
return false if __empty_range?(self_begin, self_end, self_excl)
|
||||
return false if __empty_range?(other_begin, other_end, other_excl)
|
||||
|
||||
true
|
||||
end
|
||||
|
||||
def __empty_range?(b, e, excl)
|
||||
return false if b.nil? || e.nil?
|
||||
|
||||
comp = b <=> e
|
||||
comp.nil? || comp > 0 || (comp == 0 && excl)
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user