use std::{ array::TryFromSliceError, hash::{DefaultHasher, Hash, Hasher}, }; use bevy::prelude::*; use rand::random; /// Value with which to initialize the PRNG #[derive(Resource, Clone, Copy)] pub struct Seed(u64); impl Seed { /// Use a random integer as the seed pub fn random() -> Self { Self(random()) } } impl From for Seed { /// Attempt to parse as an integer, fall back to hashing string fn from(value: String) -> Self { Self(value.parse::().unwrap_or_else(|_| { let mut state = DefaultHasher::new(); value.hash(&mut state); state.finish() })) } } impl From for [u8; 8] { fn from(value: Seed) -> Self { value.0.to_le_bytes() } } impl From<[u8; 8]> for Seed { fn from(value: [u8; 8]) -> Self { u64::from_le_bytes(value).into() } } impl From for u64 { fn from(value: Seed) -> Self { value.0 } } impl From for Seed { fn from(value: u64) -> Self { Seed(value) } } impl From for Vec { fn from(value: Seed) -> Self { value.0.to_le_bytes().to_vec() } } impl TryFrom> for Seed { type Error = TryFromSliceError; fn try_from(value: Vec) -> Result { let bytes: [u8; 8] = value.as_slice().try_into()?; Ok(bytes.into()) } }