1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
use std::{any::type_name, marker::PhantomData};

use crate::Generator;
use rand::{rngs::SmallRng, Fill, Rng, SeedableRng};

#[derive(Clone)]
pub struct RandomVec<T>(SmallRng, usize, PhantomData<T>, String);

impl<T> RandomVec<T> {
    #[allow(unused)]
    pub fn new(size: usize) -> Self {
        Self(
            SmallRng::seed_from_u64(42),
            size,
            PhantomData,
            format!("{}/{}", type_name::<T>(), size),
        )
    }
}

impl<T: Default + Copy> Generator for RandomVec<T>
where
    [T]: Fill,
{
    type Haystack = Vec<T>;
    type Needle = ();

    fn next_haystack(&mut self) -> Self::Haystack {
        let RandomVec(rng, size, _, _) = self;
        let mut v = vec![T::default(); *size];
        rng.fill(&mut v[..]);
        v
    }

    fn next_needle(&mut self, _haystack: &Self::Haystack) -> Self::Needle {}

    fn name(&self) -> &str {
        &self.3
    }

    fn sync(&mut self, seed: u64) {
        self.0 = SmallRng::seed_from_u64(seed);
    }
}