git_iblame/extensions/
range_ext.rs

1use std::ops::Range;
2
3/// An extension trait to add `Range::intersect()`.
4pub trait RangeExt<Idx> {
5    /// Get the intersection of two `Range`s.
6    /// ```
7    /// use git_iblame::RangeExt;
8    /// assert_eq!((2..4).intersect(1..6), 2..4);
9    /// assert_eq!((2..4).intersect(3..6), 3..4);
10    /// assert_eq!((2..4).intersect(1..3), 2..3);
11    /// assert!((2..4).intersect(4..6).is_empty());
12    /// ```
13    fn intersect(&self, other: Range<Idx>) -> Range<Idx>;
14}
15
16impl<Idx: Copy + Ord> RangeExt<Idx> for Range<Idx> {
17    fn intersect(&self, other: Range<Idx>) -> Range<Idx> {
18        let start = self.start.max(other.start);
19        let end = self.end.min(other.end);
20        start..end
21    }
22}