]>
git.proxmox.com Git - rustc.git/blob - src/vendor/itertools/src/unique_impl.rs
2 use std
::collections
::HashMap
;
3 use std
::collections
::hash_map
::{Entry}
;
7 /// An iterator adapter to filter out duplicate elements.
9 /// See [`.unique_by()`](../trait.Itertools.html#method.unique) for more information.
11 #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
12 pub struct UniqueBy
<I
: Iterator
, V
, F
> {
14 // Use a hashmap for the entry API
19 impl<I
, V
, F
> fmt
::Debug
for UniqueBy
<I
, V
, F
>
20 where I
: Iterator
+ fmt
::Debug
,
21 V
: fmt
::Debug
+ Hash
+ Eq
,
23 debug_fmt_fields
!(UniqueBy
, iter
, used
);
26 /// Create a new `UniqueBy` iterator.
27 pub fn unique_by
<I
, V
, F
>(iter
: I
, f
: F
) -> UniqueBy
<I
, V
, F
>
29 F
: FnMut(&I
::Item
) -> V
,
39 // count the number of new unique keys in iterable (`used` is the set already seen)
40 fn count_new_keys
<I
, K
>(mut used
: HashMap
<K
, ()>, iterable
: I
) -> usize
41 where I
: IntoIterator
<Item
=K
>,
44 let iter
= iterable
.into_iter();
45 let current_used
= used
.len();
46 used
.extend(iter
.map(|key
| (key
, ())));
47 used
.len() - current_used
50 impl<I
, V
, F
> Iterator
for UniqueBy
<I
, V
, F
>
53 F
: FnMut(&I
::Item
) -> V
57 fn next(&mut self) -> Option
<I
::Item
> {
58 while let Some(v
) = self.iter
.next() {
59 let key
= (self.f
)(&v
);
60 if self.used
.insert(key
, ()).is_none() {
68 fn size_hint(&self) -> (usize, Option
<usize>) {
69 let (low
, hi
) = self.iter
.size_hint();
70 ((low
> 0 && self.used
.is_empty()) as usize, hi
)
73 fn count(self) -> usize {
74 let mut key_f
= self.f
;
75 count_new_keys(self.used
, self.iter
.map(move |elt
| key_f(&elt
)))
79 impl<I
> Iterator
for Unique
<I
>
81 I
::Item
: Eq
+ Hash
+ Clone
85 fn next(&mut self) -> Option
<I
::Item
> {
86 while let Some(v
) = self.iter
.iter
.next() {
87 if let Entry
::Vacant(entry
) = self.iter
.used
.entry(v
) {
88 let elt
= entry
.key().clone();
97 fn size_hint(&self) -> (usize, Option
<usize>) {
98 let (low
, hi
) = self.iter
.iter
.size_hint();
99 ((low
> 0 && self.iter
.used
.is_empty()) as usize, hi
)
102 fn count(self) -> usize {
103 count_new_keys(self.iter
.used
, self.iter
.iter
)
107 /// An iterator adapter to filter out duplicate elements.
109 /// See [`.unique()`](../trait.Itertools.html#method.unique) for more information.
111 #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
112 pub struct Unique
<I
: Iterator
> {
113 iter
: UniqueBy
<I
, I
::Item
, ()>,
116 impl<I
> fmt
::Debug
for Unique
<I
>
117 where I
: Iterator
+ fmt
::Debug
,
118 I
::Item
: Hash
+ Eq
+ fmt
::Debug
,
120 debug_fmt_fields
!(Unique
, iter
);
123 pub fn unique
<I
>(iter
: I
) -> Unique
<I
>
130 used
: HashMap
::new(),