1use std::cell::RefCell;
2
3use crate::IRandomizer;
4
5pub struct Randomizer<R, Seed, F: Fn(&Seed) -> (R, Seed)> {
6 seed: RefCell<Seed>,
7 func: F,
8}
9
10impl<R, Seed, F: Fn(&Seed) -> (R, Seed)> Randomizer<R, Seed, F> {
11 pub fn new(seed: Seed, func: F) -> Self {
12 Self {
13 seed: RefCell::new(seed),
14 func,
15 }
16 }
17}
18
19impl<R, Seed, F: Fn(&Seed) -> (R, Seed)> IRandomizer<R> for Randomizer<R, Seed, F> {
20 fn gen_pure(&self) -> R {
21 let mut ptr = self.seed.borrow_mut();
22 let (res, new_seed) = (self.func)(&*ptr);
23 *ptr = new_seed;
24 res
25 }
26}
27
28#[cfg(test)]
29mod tests {
30 use super::*;
31
32 fn inc(val: &usize) -> (usize, usize) {
33 (val % 5, val + 1)
34 }
35
36 #[test]
37 fn test_inc() {
38 let randomizer = Randomizer::new(1, &inc);
39 assert_eq!(randomizer.gen_pure(), 1);
40 assert_eq!(randomizer.gen_pure(), 2);
41 assert_eq!(randomizer.gen_pure(), 3);
42 assert_eq!(randomizer.gen_pure(), 4);
43 assert_eq!(randomizer.gen_pure(), 0);
44 assert_eq!(randomizer.gen_pure(), 1);
45 }
46}