counter/impls/add_iterable.rs
1use crate::Counter;
2
3use num_traits::{One, Zero};
4
5use std::hash::{BuildHasher, Hash};
6use std::ops::{Add, AddAssign};
7
8impl<I, T, N, S> Add<I> for Counter<T, N, S>
9where
10 I: IntoIterator<Item = T>,
11 T: Hash + Eq,
12 N: AddAssign + Zero + One,
13 S: BuildHasher,
14{
15 type Output = Self;
16 /// Consume `self` producing a `Counter` like `self` updated with the counts of
17 /// the elements of `I`.
18 ///
19 /// ```rust
20 /// # use counter::Counter;
21 /// # use std::collections::HashMap;
22 /// let counter = "abbccc".chars().collect::<Counter<_>>();
23 ///
24 /// let new_counter = counter + "aeeeee".chars();
25 /// let expected: HashMap<char, usize> = [('a', 2), ('b', 2), ('c', 3), ('e', 5)]
26 /// .iter().cloned().collect();
27 /// assert_eq!(new_counter.into_map(), expected);
28 /// ```
29 fn add(mut self, rhs: I) -> Self::Output {
30 self.update(rhs);
31 self
32 }
33}
34
35impl<I, T, N, S> AddAssign<I> for Counter<T, N, S>
36where
37 I: IntoIterator<Item = T>,
38 T: Hash + Eq,
39 N: AddAssign + Zero + One,
40 S: BuildHasher,
41{
42 /// Directly add the counts of the elements of `I` to `self`.
43 ///
44 /// ```rust
45 /// # use counter::Counter;
46 /// # use std::collections::HashMap;
47 /// let mut counter = "abbccc".chars().collect::<Counter<_>>();
48 ///
49 /// counter += "aeeeee".chars();
50 /// let expected: HashMap<char, usize> = [('a', 2), ('b', 2), ('c', 3), ('e', 5)]
51 /// .iter().cloned().collect();
52 /// assert_eq!(counter.into_map(), expected);
53 /// ```
54 fn add_assign(&mut self, rhs: I) {
55 self.update(rhs);
56 }
57}