#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, Ord, PartialOrd)]
#[cfg_attr(feautre = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Zero;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, Ord, PartialOrd)]
#[cfg_attr(feautre = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct NonZero;
pub trait ZeroChoice:
Default
+ Clone
+ PartialEq
+ Eq
+ Copy
+ DecideZero<NonZero>
+ DecideZero<Zero>
+ core::hash::Hash
+ Ord
+ PartialOrd
+ 'static
{
fn is_zero() -> bool;
}
impl ZeroChoice for Zero {
fn is_zero() -> bool {
true
}
}
impl ZeroChoice for NonZero {
fn is_zero() -> bool {
false
}
}
pub trait DecideZero<ZZ> {
type Out;
}
impl<Z: ZeroChoice> DecideZero<Z> for Zero {
type Out = Zero;
}
impl<Z: ZeroChoice> DecideZero<Z> for NonZero {
type Out = Z;
}