#[cfg(test)]
mod tests;
use bevy::prelude::*;
use getrandom::rand_core::{SeedableRng, TryRng};
#[cfg(feature = "chacha")]
pub use rand_chacha;
pub use getrandom::rand_core;
#[derive(Resource, Deref, DerefMut)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct GlobalRng<R: TryRng + Sync + Send>(R);
impl<R: TryRng + SeedableRng + Sync + Send> SeedableRng for GlobalRng<R> {
type Seed = R::Seed;
fn from_seed(seed: Self::Seed) -> Self {
R::from_seed(seed).into()
}
}
impl<R: TryRng + SeedableRng + Sync + Send> From<R> for GlobalRng<R> {
fn from(value: R) -> Self {
Self(value)
}
}
#[derive(Component, Deref, DerefMut)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct EntityRng<R: TryRng + Sync + Send> (R);
impl<R: TryRng + SeedableRng + Sync + Send> SeedableRng for EntityRng<R> {
type Seed = R::Seed;
fn from_seed(seed: Self::Seed) -> Self {
R::from_seed(seed).into()
}
}
impl<R: TryRng + SeedableRng + Sync + Send> From<R> for EntityRng<R> {
fn from(value: R) -> Self {
Self(value)
}
}
#[cfg(feature = "from_time")]
pub mod from_time {
use getrandom::rand_core::{SeedableRng, TryRng};
pub fn time_seed() -> u64 {
web_time::SystemTime::now()
.duration_since(web_time::UNIX_EPOCH)
.expect("Current time should be after epoch")
.as_secs()
}
pub fn random_from_time<R: SeedableRng>() -> R {
R::seed_from_u64(time_seed())
}
impl<R: SeedableRng + TryRng + Sync + Send> super::EntityRng<R> {
pub fn from_time() -> Self {
random_from_time::<R>().into()
}
}
impl<R: SeedableRng + TryRng + Sync + Send> Default for super::EntityRng<R> {
fn default() -> Self {
Self::from_time()
}
}
impl<R: SeedableRng + TryRng + Sync + Send> super::GlobalRng<R> {
pub fn from_time() -> Self {
random_from_time::<R>().into()
}
}
impl<R: SeedableRng + TryRng + Sync + Send> Default for super::GlobalRng<R> {
fn default() -> Self {
Self::from_time()
}
}
}
#[cfg(feature = "chacha")]
pub type ChaChaGlobalRng = GlobalRng<rand_chacha::ChaChaRng>;
#[cfg(feature = "chacha")]
pub type ChaChaEntityRng = EntityRng<rand_chacha::ChaChaRng>;