Skip to main content

bubbles/saliency/
random.rs

1//! [`RandomAvailable`] - random choice among eligible candidates (`rand` feature).
2
3use super::candidate::{Candidate, SaliencyStrategy};
4
5/// Picks a random available candidate.
6///
7/// Only available with the `rand` feature.
8///
9/// # Example
10///
11/// ```rust
12/// use bubbles::saliency::{Candidate, RandomAvailable, SaliencyStrategy};
13///
14/// let mut s = RandomAvailable;
15/// let candidates = vec![
16///     Candidate { id: "a", available: false },
17///     Candidate { id: "b", available: true },
18///     Candidate { id: "c", available: true },
19/// ];
20/// let idx = s.select(&candidates);
21/// assert!(idx == Some(1) || idx == Some(2));
22/// ```
23#[derive(Debug, Clone, Default)]
24pub struct RandomAvailable;
25
26impl SaliencyStrategy for RandomAvailable {
27    fn select(&mut self, candidates: &[Candidate<'_>]) -> Option<usize> {
28        use rand::seq::IndexedRandom as _;
29        let available: Vec<usize> = candidates
30            .iter()
31            .enumerate()
32            .filter_map(|(i, c)| if c.available { Some(i) } else { None })
33            .collect();
34        available.choose(&mut rand::rng()).copied()
35    }
36}