diff --git a/mrbgems/mruby-range-ext/mrblib/range.rb b/mrbgems/mruby-range-ext/mrblib/range.rb index e229c918a..5d1e3cb83 100644 --- a/mrbgems/mruby-range-ext/mrblib/range.rb +++ b/mrbgems/mruby-range-ext/mrblib/range.rb @@ -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