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