gacha/draw_cards/
builder.rs1use super::*;
2use std::slice::Iter;
3
4impl<T> WeightedList<T> {
5 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 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}