peroxide/util/
wrapper.rs

1extern crate rand;
2use rand::prelude::*;
3
4// =============================================================================
5// Random Wrapper
6// =============================================================================
7/// Extract no-duplicate sample from Vector
8pub trait SampleRNG {
9    type Item;
10    fn sample(&self, n: usize) -> Vec<Self::Item>;
11}
12
13impl SampleRNG for Vec<usize> {
14    type Item = usize;
15    fn sample(&self, n: usize) -> Vec<Self::Item> {
16        let mut rng = rand::rng();
17        self.iter().map(|x| *x).choose_multiple(&mut rng, n)
18    }
19}
20
21impl SampleRNG for Vec<u32> {
22    type Item = u32;
23    fn sample(&self, n: usize) -> Vec<Self::Item> {
24        let mut rng = rand::rng();
25        self.iter().map(|x| *x).choose_multiple(&mut rng, n)
26    }
27}
28
29impl SampleRNG for Vec<u64> {
30    type Item = u64;
31    fn sample(&self, n: usize) -> Vec<Self::Item> {
32        let mut rng = rand::rng();
33        self.iter().map(|x| *x).choose_multiple(&mut rng, n)
34    }
35}
36
37impl SampleRNG for Vec<isize> {
38    type Item = isize;
39    fn sample(&self, n: usize) -> Vec<Self::Item> {
40        let mut rng = rand::rng();
41        self.iter().map(|x| *x).choose_multiple(&mut rng, n)
42    }
43}
44
45impl SampleRNG for Vec<i32> {
46    type Item = i32;
47    fn sample(&self, n: usize) -> Vec<Self::Item> {
48        let mut rng = rand::rng();
49        self.iter().map(|x| *x).choose_multiple(&mut rng, n)
50    }
51}
52
53impl SampleRNG for Vec<i64> {
54    type Item = i64;
55    fn sample(&self, n: usize) -> Vec<Self::Item> {
56        let mut rng = rand::rng();
57        self.iter().map(|x| *x).choose_multiple(&mut rng, n)
58    }
59}
60
61impl SampleRNG for Vec<f64> {
62    type Item = f64;
63    fn sample(&self, n: usize) -> Vec<Self::Item> {
64        let mut rng = rand::rng();
65        self.iter().map(|x| *x).choose_multiple(&mut rng, n)
66    }
67}
68
69impl SampleRNG for Vec<f32> {
70    type Item = f32;
71    fn sample(&self, n: usize) -> Vec<Self::Item> {
72        let mut rng = rand::rng();
73        self.iter().map(|x| *x).choose_multiple(&mut rng, n)
74    }
75}
76
77impl SampleRNG for Vec<char> {
78    type Item = char;
79    fn sample(&self, n: usize) -> Vec<Self::Item> {
80        let mut rng = rand::rng();
81        self.iter().map(|x| *x).choose_multiple(&mut rng, n)
82    }
83}
84
85impl<'a> SampleRNG for Vec<&'a str> {
86    type Item = &'a str;
87    fn sample(&self, n: usize) -> Vec<Self::Item> {
88        let mut rng = rand::rng();
89        self.iter().map(|x| *x).choose_multiple(&mut rng, n)
90    }
91}
92
93impl SampleRNG for String {
94    type Item = char;
95    fn sample(&self, n: usize) -> Vec<Self::Item> {
96        let mut rng = rand::rng();
97        self.chars().choose_multiple(&mut rng, n)
98    }
99}