chiark / gitweb /
fake-rng: Provide range() method
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 16 Apr 2022 00:12:09 +0000 (01:12 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 16 Apr 2022 00:12:09 +0000 (01:12 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/fake-rng.rs

index dbce35aab1b90917ec1d483b1fb68993ff28770c..0c0b6d5d2d841111dbda195b83ce090957dd1116 100644 (file)
@@ -5,6 +5,7 @@
 use crate::prelude::*;
 
 use parking_lot::Mutex;
+use rand::distributions::uniform::SampleUniform;
 
 #[derive(Deserialize,Debug,Clone,Default)]
 #[serde(transparent)]
@@ -63,4 +64,19 @@ impl RngWrap {
       slice[l-n..].copy_from_slice(&front);
     },
   } }
+
+  pub fn range<T>(&self, range: std::ops::Range<T>) -> T
+  where T: SampleUniform + FromStr + Ord + Default
+  {
+    match self.next_fake() {
+      None => {
+        let mut rng = thread_rng();
+        rng.gen_range(range)
+      },
+      Some(s) => (||{
+        let n: T = s.parse().ok()?;
+        range.contains(&n).then(|| n)
+      })().unwrap_or_default(),
+    }
+  }
 }