use rand::distributions::Distribution;
use rand::{thread_rng, Rng};
use super::{
Area, HasHeight, HasWidth, PlacedShape, ProvidesArea, ProvidesPlacedShape, ProvidesSize, Size,
};
#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq)]
pub struct SizeRange {
min_size: Size,
max_size: Size,
}
impl SizeRange {
#[must_use]
pub fn new(min_size: Size, max_size: Size) -> Self {
Self { min_size, max_size }
}
}
impl Distribution<Size> for SizeRange {
fn sample<R>(&self, rng: &mut R) -> Size
where
R: Rng + ?Sized,
{
Size::new(
rng.gen_range(self.min_size.width()..=self.max_size.width()),
rng.gen_range(self.min_size.height()..=self.max_size.height()),
)
}
}
impl From<Size> for SizeRange {
fn from(size: Size) -> Self {
Self::new(size, size)
}
}
impl ProvidesPlacedShape for SizeRange {
fn provide_placed_shape(&self) -> Box<dyn PlacedShape> {
Box::new(self.provide_area())
}
}
impl ProvidesSize for SizeRange {
fn provide_size(&self) -> Size {
self.sample(&mut thread_rng())
}
}
impl ProvidesArea for SizeRange {
fn provide_area(&self) -> Area {
Area::from(self.provide_size())
}
}