#[derive(Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct SplitMix64 {
state: u64,
}
impl SplitMix64 {
#[must_use]
pub const fn new(seed: u64) -> Self {
Self { state: seed }
}
}
impl Iterator for SplitMix64 {
type Item = u64;
fn next(&mut self) -> Option<Self::Item> {
self.state = self.state.wrapping_add(0x9E37_79B9_7F4A_7C15);
let mut s = self.state;
s = (s ^ (s >> 30)).wrapping_mul(0xBF58_476D_1CE4_E5B9);
s = (s ^ (s >> 27)).wrapping_mul(0x94D0_49BB_1331_11EB);
Some(s ^ (s >> 31))
}
}