Skip to content

Commit ffb2b16

Browse files
authored
Merge pull request #83 from milonimrod/master
Added Interval overlap size
2 parents 73a00f7 + 5a4b995 commit ffb2b16

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

intervaltree/interval.py

+23
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,29 @@ def overlaps(self, begin, end=None):
5353
except:
5454
return self.contains_point(begin)
5555

56+
def overlap_size(self, begin, end=None):
57+
"""
58+
Return the overlap size between two intervals or a point
59+
:param begin: beginning point of the range, or the point, or an Interval
60+
:param end: end point of the range. Optional if not testing ranges.
61+
:return: Return the overlap size, None if not overlap is found
62+
:rtype: depends on the given input (e.g., int will be returned for int interval and timedelta for
63+
datetime intervals)
64+
"""
65+
overlaps = self.overlaps(begin, end)
66+
if not overlaps:
67+
return 0
68+
69+
if end is not None:
70+
# case end is given
71+
i0 = max(self.begin, begin)
72+
i1 = min(self.end, end)
73+
return i1 - i0
74+
# assume the type is interval, in other cases, an exception will be thrown
75+
i0 = max(self.begin, begin.begin)
76+
i1 = min(self.end, begin.end)
77+
return i1 - i0
78+
5679
def contains_point(self, p):
5780
"""
5881
Whether the Interval contains p.

test/interval_methods/binary_test.py

+14-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,20 @@
3636
iv10 = Interval(-5, 0)
3737

3838

39-
def test_interval_overlaps_interval():
39+
def test_interval_overlaps_size_interval():
40+
assert iv0.overlap_size(iv0) == 10
41+
assert not iv0.overlap_size(iv1)
42+
assert not iv0.overlap_size(iv2)
43+
assert iv0.overlap_size(iv3) == 5
44+
assert iv0.overlap_size(iv4) == 10
45+
assert iv0.overlap_size(iv5) == 10
46+
assert iv0.overlap_size(iv6) == 10
47+
assert iv0.overlap_size(iv7) == 5
48+
assert not iv0.overlap_size(iv8)
49+
assert not iv0.overlap_size(iv9)
50+
51+
52+
def test_interval_overlap_interval():
4053
assert iv0.overlaps(iv0)
4154
assert not iv0.overlaps(iv1)
4255
assert not iv0.overlaps(iv2)

0 commit comments

Comments
 (0)