use core::fmt::Debug;
pub trait MathOps<T>: Copy + Clone + Debug {
fn sqrt(self) -> T;
fn abs(self) -> T;
fn min(self, other: T) -> T;
fn max(self, other: T) -> T;
fn floor(self) -> T;
fn ceil(self) -> T;
fn pow(self, exp: T) -> T;
fn ln(self) -> T;
fn log10(self) -> T;
}
pub trait TrigOps<T>: Copy + Clone + Debug {
fn sin(self) -> T;
fn cos(self) -> T;
fn tan(self) -> T;
fn to_radians(self) -> T;
fn to_degrees(self) -> T;
}
pub trait FloatLike<T>: MathOps<T> + TrigOps<T> + PartialOrd + PartialEq {
fn zero() -> T;
fn one() -> T;
fn pi() -> T;
fn is_finite(self) -> bool;
fn is_nan(self) -> bool;
fn is_infinite(self) -> bool;
}
pub trait MathBackend<T> {
fn sqrt(&self, x: T) -> T;
fn abs(&self, x: T) -> T;
fn min(&self, a: T, b: T) -> T;
fn max(&self, a: T, b: T) -> T;
fn floor(&self, x: T) -> T;
fn ceil(&self, x: T) -> T;
fn pow(&self, x: T, y: T) -> T;
fn ln(&self, x: T) -> T;
fn log10(&self, x: T) -> T;
fn sin(&self, x: T) -> T;
fn cos(&self, x: T) -> T;
fn tan(&self, x: T) -> T;
fn to_radians(&self, degrees: T) -> T;
fn to_degrees(&self, radians: T) -> T;
fn atan2(&self, y: T, x: T) -> T;
}