pub trait AddId {
    const ZERO: Self;
}

macro_rules! impl_add_id_int {
    ($($t:ty),* $(,)?) => {
        $(
            impl AddId for $t {
                const ZERO: Self = 0;
            }
        )*
    };
}

macro_rules! impl_add_id_float {
    ($($t:ty),* $(,)?) => {
        $(
            impl AddId for $t {
                const ZERO: Self = 0.0;
            }
        )*
    };
}

impl_add_id_int!(i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize);
impl_add_id_float!(f32, f64);

pub use crate::math::traits::sign::{
    Abs,
    HasPartialSign,
    HasSign,
    Sign,
    Signed,
    Signum,
    Unsigned,
};
