safe-arithmetic 0.0.3

Traits for safe arithmetic operations in rust
Documentation
#[allow(clippy::module_name_repetitions)]
pub trait ClampMin {
    #[must_use]
    fn clamp_min<MIN>(self, min: MIN) -> Self
    where
        Self: Sized,
        MIN: Into<Self>;
}

pub trait Clamp {
    #[must_use]
    fn clamp<MIN, MAX>(self, min: MIN, max: MAX) -> Self
    where
        Self: Sized,
        MIN: Into<Self>,
        MAX: Into<Self>;
}

impl<T> Clamp for T
where
    Self: Sized + PartialOrd<Self>,
{
    #[inline]
    #[must_use]
    fn clamp<MIN, MAX>(self, min: MIN, max: MAX) -> Self
    where
        MIN: Into<Self>,
        MAX: Into<Self>,
    {
        num::clamp(self, min.into(), max.into())
    }
}

impl<T> ClampMin for T
where
    Self: Sized + PartialOrd<Self>,
{
    #[inline]
    #[must_use]
    fn clamp_min<MIN>(self, min: MIN) -> Self
    where
        MIN: Into<Self>,
    {
        num::traits::clamp_min(self, min.into())
    }
}

#[cfg(test)]
mod tests {
    use super::{Clamp, ClampMin};
    use approx::assert_abs_diff_eq;

    #[test]
    fn clamp_using_partial_ord() {
        assert_eq!(Clamp::clamp(10u32, 5u32, 12u32), 10u32);
        assert_eq!(Clamp::clamp(10u32, 11u32, 12u32), 11u32);
        assert_abs_diff_eq!(Clamp::clamp(3f32, 0f32, 2f32), 2f32);
    }

    #[test]
    fn clamp_min_using_partial_ord() {
        assert_eq!(ClampMin::clamp_min(10u32, 5u32), 10u32);
        assert_eq!(ClampMin::clamp_min(10u32, 11u32), 11u32);
        assert_abs_diff_eq!(ClampMin::clamp_min(3f32, 0f32), 3f32);
    }
}