From e3c5839159903658a667f789963f20a31567b25c Mon Sep 17 00:00:00 2001 From: Mica White Date: Thu, 30 Jul 2026 07:34:24 -0400 Subject: Initial commit --- src/random.rs | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/random.rs (limited to 'src/random.rs') diff --git a/src/random.rs b/src/random.rs new file mode 100644 index 0000000..334b6bf --- /dev/null +++ b/src/random.rs @@ -0,0 +1,73 @@ +use rand::{Rng, SeedableRng, TryRng, rngs::SmallRng}; + +mod tortuise { + #[link(wasm_import_module = "tortuise")] + unsafe extern "C" { + pub safe fn random_u64() -> u64; + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct TortuiseRng(SmallRng); + +impl TortuiseRng { + pub fn new() -> Self { + Self::seed_from_u64(tortuise::random_u64()) + } +} + +impl Default for TortuiseRng { + fn default() -> Self { + Self::new() + } +} + +impl SeedableRng for TortuiseRng { + type Seed = ::Seed; + + fn from_seed(seed: Self::Seed) -> Self { + Self(SmallRng::from_seed(seed)) + } + + fn seed_from_u64(state: u64) -> Self { + Self(SmallRng::seed_from_u64(state)) + } + + fn from_rng(rng: &mut R) -> Self { + Self(SmallRng::from_rng(rng)) + } + + fn try_from_rng(rng: &mut R) -> Result { + Ok(Self(SmallRng::try_from_rng(rng)?)) + } + + fn fork(&mut self) -> Self + where + Self: Rng, + { + Self(self.0.fork()) + } + + fn try_fork(&mut self) -> Result::Error> + where + Self: TryRng, + { + Ok(Self(self.0.try_fork()?)) + } +} + +impl TryRng for TortuiseRng { + type Error = ::Error; + + fn try_next_u32(&mut self) -> Result { + self.0.try_next_u32() + } + + fn try_next_u64(&mut self) -> Result { + self.0.try_next_u64() + } + + fn try_fill_bytes(&mut self, dst: &mut [u8]) -> Result<(), Self::Error> { + self.0.try_fill_bytes(dst) + } +} -- cgit v1.3.1