use crate::*;
pub trait HasNexts: PartialOrd + Sized {
fn next(&self) -> Option<Self>;
fn prev(&self) -> Option<Self>;
}
impl<T> HasNexts for T
where
T: Step,
{
fn next(&self) -> Option<Self> {
T::forward_checked(self.clone(), 1)
}
fn prev(&self) -> Option<Self> {
T::backward_checked(self.clone(), 1)
}
}
macro_rules! impl_has_nexts_for_float {
($ty:ty) => {
impl HasNexts for $ty {
fn next(&self) -> Option<Self> {
(self != &Self::INFINITY && !self.is_nan()).then_some(self.next_up())
}
fn prev(&self) -> Option<Self> {
(self != &Self::NEG_INFINITY && !self.is_nan()).then_some(self.next_down())
}
}
};
}
impl_has_nexts_for_float!(f32);
impl_has_nexts_for_float!(f64);