warlocks_cauldron/providers/
choice.rs

1use crate::random::*;
2
3/// Methods collection for generating a random choice from items in a sequence
4pub struct Choice;
5
6impl Choice {
7    /// Get a randomly-chosen item from iter
8    pub fn get<T, V: Iterator<Item = T>>(iter: V) -> T {
9        get_random_element(iter)
10    }
11
12    /// Get a bool with a probability p of being true.
13    pub fn prob(p: f64) -> bool {
14        rand_bool(p)
15    }
16
17    /// Generate a randomly-chosen sequence or bare element from a sequence
18    pub fn pick<'a, T>(items: &'a Vec<T>, length: usize) -> Vec<&'a T> {
19        get_random_elements(items.iter(), length)
20    }
21
22    /// Generate a randomly-chosen unique sequence or bare element from a sequence
23    pub fn pick_unique<'a, T: std::cmp::Eq>(items: &'a Vec<T>, length: usize) -> Vec<&'a T> {
24        let mut output = vec![];
25
26        let mut uniques: Vec<&T> = vec![];
27        for item in items.iter() {
28            if !uniques.contains(&item) {
29                uniques.push(item);
30            }
31        }
32
33        loop {
34            if uniques.is_empty() {
35            break 
36            }
37
38            output.push(
39                uniques.remove(randint(0, uniques.len() - 1))
40            );
41
42            if output.len() == length {
43                break
44            }
45        }
46
47        output
48    }
49}
50