unique_count/
lib.rs

1use std::collections::{BTreeMap, BinaryHeap, VecDeque};
2
3pub trait UniqueCount<T> {
4    /// count the number of each value in self
5    fn unique_count(&self) -> BTreeMap<T, usize>;
6}
7
8impl<T: Ord + Clone> UniqueCount<T> for &[T] {
9    fn unique_count(&self) -> BTreeMap<T, usize> {
10        let mut res = BTreeMap::new();
11        for ele in self.iter() {
12            *res.entry(ele.clone()).or_insert(0) += 1;
13        }
14
15        res
16    }
17}
18
19impl<T: Ord + Clone> UniqueCount<T> for &[&T] {
20    fn unique_count(&self) -> BTreeMap<T, usize> {
21        let mut res = BTreeMap::new();
22        for &ele in self.iter() {
23            *res.entry(ele.clone()).or_insert(0) += 1;
24        }
25
26        res
27    }
28}
29
30impl<T: Ord + Clone> UniqueCount<T> for Vec<T> {
31    fn unique_count(&self) -> BTreeMap<T, usize> {
32        let mut res = BTreeMap::new();
33        for ele in self.iter() {
34            *res.entry(ele.clone()).or_insert(0) += 1;
35        }
36
37        res
38    }
39}
40
41impl<T: Ord + Clone> UniqueCount<T> for Vec<&T> {
42    fn unique_count(&self) -> BTreeMap<T, usize> {
43        let mut res = BTreeMap::new();
44        for &ele in self.iter() {
45            *res.entry(ele.clone()).or_insert(0) += 1;
46        }
47
48        res
49    }
50}
51
52impl<T: Ord + Clone> UniqueCount<T> for &Vec<T> {
53    fn unique_count(&self) -> BTreeMap<T, usize> {
54        let mut res = BTreeMap::new();
55        for ele in self.iter() {
56            *res.entry(ele.clone()).or_insert(0) += 1;
57        }
58
59        res
60    }
61}
62
63impl<T: Ord + Clone> UniqueCount<T> for &Vec<&T> {
64    fn unique_count(&self) -> BTreeMap<T, usize> {
65        let mut res = BTreeMap::new();
66        for &ele in self.iter() {
67            *res.entry(ele.clone()).or_insert(0) += 1;
68        }
69
70        res
71    }
72}
73
74impl<T: Ord + Clone> UniqueCount<T> for VecDeque<T> {
75    fn unique_count(&self) -> BTreeMap<T, usize> {
76        let mut res = BTreeMap::new();
77        for ele in self.iter() {
78            *res.entry(ele.clone()).or_insert(0) += 1;
79        }
80
81        res
82    }
83}
84
85impl<T: Ord + Clone> UniqueCount<T> for VecDeque<&T> {
86    fn unique_count(&self) -> BTreeMap<T, usize> {
87        let mut res = BTreeMap::new();
88        for &ele in self.iter() {
89            *res.entry(ele.clone()).or_insert(0) += 1;
90        }
91
92        res
93    }
94}
95
96impl<T: Ord + Clone> UniqueCount<T> for &VecDeque<T> {
97    fn unique_count(&self) -> BTreeMap<T, usize> {
98        let mut res = BTreeMap::new();
99        for ele in self.iter() {
100            *res.entry(ele.clone()).or_insert(0) += 1;
101        }
102
103        res
104    }
105}
106
107impl<T: Ord + Clone> UniqueCount<T> for &VecDeque<&T> {
108    fn unique_count(&self) -> BTreeMap<T, usize> {
109        let mut res = BTreeMap::new();
110        for &ele in self.iter() {
111            *res.entry(ele.clone()).or_insert(0) += 1;
112        }
113
114        res
115    }
116}
117
118impl<T: Ord + Clone> UniqueCount<T> for BinaryHeap<T> {
119    fn unique_count(&self) -> BTreeMap<T, usize> {
120        let mut res = BTreeMap::new();
121        for ele in self.iter() {
122            *res.entry(ele.clone()).or_insert(0) += 1;
123        }
124
125        res
126    }
127}
128
129impl<T: Ord + Clone> UniqueCount<T> for BinaryHeap<&T> {
130    fn unique_count(&self) -> BTreeMap<T, usize> {
131        let mut res = BTreeMap::new();
132        for &ele in self.iter() {
133            *res.entry(ele.clone()).or_insert(0) += 1;
134        }
135
136        res
137    }
138}
139
140impl<T: Ord + Clone> UniqueCount<T> for &BinaryHeap<T> {
141    fn unique_count(&self) -> BTreeMap<T, usize> {
142        let mut res = BTreeMap::new();
143        for ele in self.iter() {
144            *res.entry(ele.clone()).or_insert(0) += 1;
145        }
146
147        res
148    }
149}
150
151impl<T: Ord + Clone> UniqueCount<T> for &BinaryHeap<&T> {
152    fn unique_count(&self) -> BTreeMap<T, usize> {
153        let mut res = BTreeMap::new();
154        for &ele in self.iter() {
155            *res.entry(ele.clone()).or_insert(0) += 1;
156        }
157
158        res
159    }
160}