use rand::{distributions::uniform::SampleUniform};
use num_traits::{PrimInt, NumAssignOps, Num, NumCast};
pub trait Inner: PartialEq + Clone + Send + Sync + std::fmt::Debug {}
impl<T: PartialEq + Clone + Send + Sync + std::fmt::Debug> Inner for T {}
pub trait Numeric: Inner + Copy + PartialOrd + Num + NumCast + NumAssignOps + std::iter::Sum {}
impl<T: Inner + Copy + PartialOrd + Num + NumCast + NumAssignOps + std::iter::Sum> Numeric for T {}
pub trait Signed: Numeric + num_traits::Signed {}
impl<T: Numeric + num_traits::Signed> Signed for T {}
pub trait Unsigned: Numeric + num_traits::Unsigned {}
impl<T: Numeric + num_traits::Unsigned> Unsigned for T {}
pub trait Integer: Numeric + PrimInt {}
impl<T: Numeric + PrimInt> Integer for T {}
pub trait Real: Signed + num_traits::real::Real + SampleUniform {}
impl<T: Signed + num_traits::real::Real + SampleUniform> Real for T {}