minnixrand/
function.rs

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}