Method: Artic::TimeRange#bisect

Defined in:
lib/artic/time_range.rb

#bisect(other) ⇒ Array<TimeRange>

Uses this range to bisect another.

If this range does not overlap the other, returns an array with the original range.

If this range completely covers the other, returns an empty array.

Examples:

range1 = TimeRange.new('10:00'..'12:00')
range2 = TimeRange.new('09:00'..'18:00')
range3 = TimeRange.new('08:00'..'11:00')

range1.bisect(range2)
# => [
#   #<TimeRange 09:00..10:00>,
#   #<TimeRange 12:00..18:00>
# ]

range2.bisect(range1)
# => []

range3.bisect(range2)
# => [
#   #<TimeRange 11:00..18:00>
# ]

range2.bisect(range3)
# => [
#   #<TimeRange 08:00..09:00>
# ]

Parameters:

Returns:



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/artic/time_range.rb', line 98

def bisect(other)
  return [other] unless overlaps?(other)
  return [] if covers?(other)

  if self.begin <= other.begin && self.end <= other.end
    [self.end..other.end]
  elsif self.begin >= other.begin && self.end <= other.end
    [
      (other.begin..self.begin),
      (self.end..other.end)
    ]
  elsif self.begin >= other.begin && self.end >= other.end
    [other.begin..self.begin]
  end
end