omics_coordinate/position/base/
subtraction.rs

1//! Subtraction for base positions.
2
3use crate::math::CheckedSub;
4use crate::position::Number;
5use crate::position::base::Position;
6
7impl CheckedSub<Number> for Position {
8    type Output = Self;
9
10    fn checked_sub(&self, rhs: Number) -> Option<Self::Output> {
11        self.get().checked_sub(rhs).map(Position::try_new)?.ok()
12    }
13}
14
15#[cfg(test)]
16mod tests {
17    use super::*;
18
19    #[test]
20    fn addition() {
21        let ten = Position::try_new(10).unwrap();
22
23        let nine = ten.checked_sub(1).unwrap();
24        assert_eq!(nine.get(), 9);
25
26        let one = nine.checked_sub(8).unwrap();
27        assert_eq!(one.get(), 1);
28    }
29
30    #[test]
31    fn overflow() {
32        let max = Position::try_new(Number::MAX).unwrap();
33
34        let one = max.checked_sub(Number::MAX - 1).unwrap();
35        assert_eq!(one.get(), 1);
36
37        assert!(one.checked_sub(1).is_none());
38    }
39}