use std::fmt::Debug;
use bevy_reflect::TypePath;
use crate::Float;
pub trait Rounding: TypePath + Default + Debug + Copy + Send + Sync + 'static {
fn round<F: Float>(input: F) -> F;
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, TypePath)]
pub struct Truncate;
impl Rounding for Truncate {
fn round<F: Float>(input: F) -> F {
input.trunc()
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, TypePath)]
pub struct Floor;
impl Rounding for Floor {
fn round<F: Float>(input: F) -> F {
input.floor()
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, TypePath)]
pub struct Ceil;
impl Rounding for Ceil {
fn round<F: Float>(input: F) -> F {
input.ceil()
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, TypePath)]
pub struct Round;
impl Rounding for Round {
fn round<F: Float>(input: F) -> F {
input.round()
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, TypePath)]
pub struct TruncateSigned;
impl Rounding for TruncateSigned {
fn round<F: Float>(input: F) -> F {
if input > F::ZERO {
input.trunc().max(F::ONE)
} else if input < F::ZERO {
input.trunc().min(F::ZERO - F::ONE)
} else {
input
}
}
}