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}