warlocks_cauldron/providers/
choice.rs1use crate::random::*;
2
3pub struct Choice;
5
6impl Choice {
7 pub fn get<T, V: Iterator<Item = T>>(iter: V) -> T {
9 get_random_element(iter)
10 }
11
12 pub fn prob(p: f64) -> bool {
14 rand_bool(p)
15 }
16
17 pub fn pick<'a, T>(items: &'a Vec<T>, length: usize) -> Vec<&'a T> {
19 get_random_elements(items.iter(), length)
20 }
21
22 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