use core::marker::PhantomData;
use typenum::{NonZero, Unsigned};
pub struct Helpers<LNumer, LDenom, RNumer, RDenom>
where
LNumer: Unsigned,
LDenom: Unsigned + NonZero,
RNumer: Unsigned,
RDenom: Unsigned + NonZero,
{
l_numer: PhantomData<LNumer>,
r_numer: PhantomData<RNumer>,
l_denom: PhantomData<LDenom>,
r_denom: PhantomData<RDenom>,
}
impl<LNumer, LDenom, RNumer, RDenom> Helpers<LNumer, LDenom, RNumer, RDenom>
where
LNumer: Unsigned,
LDenom: Unsigned + NonZero,
RNumer: Unsigned,
RDenom: Unsigned + NonZero,
{
pub const DIVISOR: u64 = gcd::binary_u64(LDenom::U64 * RNumer::U64, RDenom::U64 * LNumer::U64);
pub const DIVISOR_2: u64 =
gcd::binary_u64(LNumer::U64 * RNumer::U64, RDenom::U64 * LDenom::U64);
pub const RD_TIMES_LN: u64 = (RDenom::U64 * LNumer::U64) / Self::DIVISOR;
pub const LD_TIMES_RN: u64 = (LDenom::U64 * RNumer::U64) / Self::DIVISOR;
pub const LN_TIMES_RN: u64 = (LNumer::U64 * RNumer::U64) / Self::DIVISOR_2;
pub const RD_TIMES_LD: u64 = (RDenom::U64 * LDenom::U64) / Self::DIVISOR_2;
pub const RATE_TO_DURATION_NUMERATOR: u64 = Self::RD_TIMES_LD / Self::LN_TIMES_RN;
pub const SAME_BASE: bool = Self::LD_TIMES_RN == Self::RD_TIMES_LN;
}