use std::ops::{Add, Sub, Mul, Div, AddAssign};
pub trait Scalar:
private::Sealed +
Copy +
Add<Self, Output=Self> +
Sub<Self, Output=Self> +
Mul<Self, Output=Self> +
Div<Self, Output=Self> +
AddAssign +
PartialOrd {
fn abs(self) -> Self;
fn sqrt(self) -> Self;
fn is_finite(self) -> bool;
fn zero() -> Self;
fn one() -> Self;
fn from_f32(x: f32) -> Self;
fn from_f64(x: f64) -> Self;
fn from_usize(x: usize) -> Self;
}
impl Scalar for f32 {
fn abs(self) -> Self {self.abs()}
fn sqrt(self) -> Self {self.sqrt()}
fn is_finite(self) -> bool {self.is_finite()}
fn zero() -> Self {0.0_f32}
fn one() -> Self {1.0_f32}
fn from_f32(x: f32) -> Self {x}
fn from_f64(x: f64) -> Self {x as f32}
fn from_usize(x: usize) -> Self {x as f32}
}
impl Scalar for f64 {
fn abs(self) -> Self {self.abs()}
fn sqrt(self) -> Self {self.sqrt()}
fn is_finite(self) -> bool {self.is_finite()}
fn zero() -> Self {0.0}
fn one() -> Self {1.0}
fn from_f32(x: f32) -> Self {x as f64}
fn from_f64(x: f64) -> Self {x}
fn from_usize(x: usize) -> Self {x as f64}
}
mod private {
pub trait Sealed {}
impl Sealed for f32 {}
impl Sealed for f64 {}
}