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}