gacha/draw_cards/
builder.rs

1use super::*;
2use std::slice::Iter;
3
4impl<T> WeightedList<T> {
5    /// Create a new empty weighted list with given capacity
6    pub fn new(capacity: usize) -> Self {
7        Self { items: Vec::with_capacity(capacity), total: 0.0 }
8    }
9}
10
11impl<T> AddAssign<(T, f64)> for WeightedList<T> {
12    fn add_assign(&mut self, rhs: (T, f64)) {
13        if rhs.1 >= 0.0 {
14            self.total += rhs.1;
15            self.items.push(WeightedElement { key: rhs.0, weight: rhs.1, accumulated: self.total });
16        }
17        else {
18            // nan, negative, zero, inf
19            log::warn!("element ignored, {} is not positive", rhs.1);
20        }
21    }
22}
23
24impl<T> AddAssign<(T, usize)> for WeightedList<T> {
25    fn add_assign(&mut self, rhs: (T, usize)) {
26        let weight = rhs.1 as f64;
27        self.total += weight;
28        self.items.push(WeightedElement { key: rhs.0, weight, accumulated: self.total });
29    }
30}
31
32impl<T> FromIterator<(T, f64)> for WeightedList<T> {
33    fn from_iter<I: IntoIterator<Item = (T, f64)>>(iter: I) -> Self {
34        let sequence = iter.into_iter();
35        let mut out = WeightedList::new(sequence.size_hint().0);
36        for (key, weight) in sequence {
37            out += (key, weight);
38        }
39        out
40    }
41}
42
43impl<T> FromIterator<(T, usize)> for WeightedList<T> {
44    fn from_iter<I: IntoIterator<Item = (T, usize)>>(iter: I) -> Self {
45        let sequence = iter.into_iter();
46        let mut out = WeightedList::new(sequence.size_hint().0);
47        for (key, weight) in sequence {
48            out += (key, weight);
49        }
50        out
51    }
52}
53
54impl<'i, T> IntoIterator for &'i WeightedList<T> {
55    type Item = &'i WeightedElement<T>;
56    type IntoIter = Iter<'i, WeightedElement<T>>;
57
58    fn into_iter(self) -> Self::IntoIter {
59        self.items.iter()
60    }
61}