use serde::{Deserialize, Serialize};
use super::random::{rand_range, rand_range_i};
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct Range<T> {
pub min: T,
pub max: T,
}
impl<T: PartialOrd + Copy> Range<T> {
pub fn new(min: T, max: T) -> Self {
if min <= max {
Self { min, max }
} else {
Self { min: max, max: min }
}
}
pub fn contains(&self, value: T) -> bool {
self.min <= value && value <= self.max
}
pub fn clamp(&self, value: T) -> T {
if value < self.min {
self.min
} else if value > self.max {
self.max
} else {
value
}
}
}
impl Range<f32> {
pub fn span(&self) -> f32 {
self.max - self.min
}
pub fn lerp(&self, t: f32) -> f32 {
self.min + self.span() * t
}
pub fn sample(&self) -> f32 {
if self.span() <= 0.0 {
return self.min;
}
rand_range(self.min, self.max)
}
}
impl Range<i32> {
pub fn span(&self) -> i32 {
self.max - self.min
}
pub fn lerp(&self, t: f32) -> i32 {
(self.min as f32 + self.span() as f32 * t).round() as i32
}
pub fn sample(&self) -> i32 {
rand_range_i(self.min, self.max + 1)
}
}
impl Default for Range<f32> {
fn default() -> Self {
Self { min: 0.0, max: 1.0 }
}
}
impl Default for Range<i32> {
fn default() -> Self {
Self { min: 0, max: 1 }
}
}