def test_interval_overlaps_point():
    iv = Interval(0, 10)

    assert not iv.overlaps(-5)
    assert iv.overlaps(0)
    assert iv.overlaps(5)
    assert not iv.overlaps(10)
    assert not iv.overlaps(15)
def test_interval_overlaps_point():
    iv = Interval(0, 10)

    assert not iv.overlaps(-5)
    assert iv.overlaps(0)
    assert iv.overlaps(5)
    assert not iv.overlaps(10)
    assert not iv.overlaps(15)
 def __getitem__(self, index):
     if type(index) is slice:
         if index.step is not None:
             raise ValueError("Slice indexing is used for intervals, which do not have a step.")
         iv = Interval(index.start, index.stop)
         result = {x.data for x in self.history[iv]}
         result.update(x[0] for x in self.current.items() if iv.overlaps(Interval(begin=x[1], end=None)))
     else:
         result = {x.data for x in self.history[index]}
         result.update(item_ for item_, time_ in self.current.items() if time_ <= index)
     return result
def diff(left: Interval, right: Interval) -> List[Interval]:
    """ Find the regions in left, without the intersection with right.

    Examples:
    >>> left = Interval(0, 5)
    >>> right = Interval(3, 10)
    >>> diff(left, right)
    [Interval(0, 3)]
    >>> left = Interval(0, 10)
    >>> right = Interval(3, 6)
    >>> diff(left, right)
    [Interval(0, 3), Interval(6, 10)]
    >>> left = Interval(3, 6)
    >>> right = Interval(0, 10)
    >>> diff(left, right)
    []
    >>> left = Interval(0, 10)
    >>> right = Interval(10, 20)
    >>> diff(left, right)
    [Interval(0, 10)]
    >>> left = Interval(5, 10)
    >>> right = Interval(0, 4)
    >>> diff(left, right)
    [Interval(5, 10)]
    >>> left = Interval(5, 10)
    >>> right = Interval(0, 7)
    >>> diff(left, right)
    [Interval(7, 10)]
    """

    if not left.overlaps(right):
        return [left]

    lstart = min([left.begin, left.end])
    lend = max([left.begin, left.end])
    rstart = min([right.begin, right.end])
    rend = max([right.begin, right.end])

    out = []
    if rstart > lstart:
        out.append(Interval(lstart, min([rstart, lend])))

    if rend < lend:
        out.append(Interval(max([lstart, rend]), lend))

    return out
def test_interval_overlaps_interval():
    iv0 = Interval(0, 10)
    iv1 = Interval(-10, -5)
    iv2 = Interval(-10, 0)
    iv3 = Interval(-10, 5)
    iv4 = Interval(-10, 10)
    iv5 = Interval(-10, 20)
    iv6 = Interval(0, 20)
    iv7 = Interval(5, 20)
    iv8 = Interval(10, 20)
    iv9 = Interval(15, 20)

    assert iv0.overlaps(iv0)
    assert not iv0.overlaps(iv1)
    assert not iv0.overlaps(iv2)
    assert iv0.overlaps(iv3)
    assert iv0.overlaps(iv4)
    assert iv0.overlaps(iv5)
    assert iv0.overlaps(iv6)
    assert iv0.overlaps(iv7)
    assert not iv0.overlaps(iv8)
    assert not iv0.overlaps(iv9)
def test_interval_overlaps_range():
    iv0 = Interval(0, 10)
    iv1 = (-10, -5)
    iv2 = (-10, 0)
    iv3 = (-10, 5)
    iv4 = (-10, 10)
    iv5 = (-10, 20)
    iv6 = (0, 20)
    iv7 = (5, 20)
    iv8 = (10, 20)
    iv9 = (15, 20)

    assert iv0.overlaps(iv0)
    assert not iv0.overlaps(*iv1)
    assert not iv0.overlaps(*iv2)
    assert iv0.overlaps(*iv3)
    assert iv0.overlaps(*iv4)
    assert iv0.overlaps(*iv5)
    assert iv0.overlaps(*iv6)
    assert iv0.overlaps(*iv7)
    assert not iv0.overlaps(*iv8)
    assert not iv0.overlaps(*iv9)
def test_interval_overlaps_interval():
    iv0 = Interval(0, 10)
    iv1 = Interval(-10, -5)
    iv2 = Interval(-10, 0)
    iv3 = Interval(-10, 5)
    iv4 = Interval(-10, 10)
    iv5 = Interval(-10, 20)
    iv6 = Interval(0, 20)
    iv7 = Interval(5, 20)
    iv8 = Interval(10, 20)
    iv9 = Interval(15, 20)

    assert iv0.overlaps(iv0)
    assert not iv0.overlaps(iv1)
    assert not iv0.overlaps(iv2)
    assert iv0.overlaps(iv3)
    assert iv0.overlaps(iv4)
    assert iv0.overlaps(iv5)
    assert iv0.overlaps(iv6)
    assert iv0.overlaps(iv7)
    assert not iv0.overlaps(iv8)
    assert not iv0.overlaps(iv9)
def test_interval_overlaps_range():
    iv0 = Interval(0, 10)
    iv1 = (-10, -5)
    iv2 = (-10, 0)
    iv3 = (-10, 5)
    iv4 = (-10, 10)
    iv5 = (-10, 20)
    iv6 = (0, 20)
    iv7 = (5, 20)
    iv8 = (10, 20)
    iv9 = (15, 20)

    assert iv0.overlaps(iv0)
    assert not iv0.overlaps(*iv1)
    assert not iv0.overlaps(*iv2)
    assert iv0.overlaps(*iv3)
    assert iv0.overlaps(*iv4)
    assert iv0.overlaps(*iv5)
    assert iv0.overlaps(*iv6)
    assert iv0.overlaps(*iv7)
    assert not iv0.overlaps(*iv8)
    assert not iv0.overlaps(*iv9)