fluent_iterable/ops/
distinct.rs1use std::collections::HashSet;
4use std::hash::Hash;
5
6#[derive(Debug)]
11pub struct Distinct<I: Iterator>
12where
13 I::Item: Clone,
14{
15 pub(crate) iter: I,
16 pub(crate) seen: HashSet<I::Item>,
17}
18
19impl<I> Iterator for Distinct<I>
20where
21 I: Iterator,
22 I::Item: Eq + Hash + Clone,
23{
24 type Item = I::Item;
25
26 fn next(&mut self) -> Option<I::Item> {
27 loop {
28 let item = self.iter.next()?;
29 if self.seen.insert(item.clone()) {
33 return Some(item);
34 }
35 }
36 }
37
38 fn size_hint(&self) -> (usize, Option<usize>) {
39 let (_, upper) = self.iter.size_hint();
40 (0, upper)
41 }
42}
43#[derive(Debug)]
48pub struct DistinctBy<I, K, F>
49where
50 I: Iterator,
51{
52 pub(crate) iter: I,
53 pub(crate) key: F,
54 pub(crate) seen: HashSet<K>,
55}
56
57impl<I, K, F> Iterator for DistinctBy<I, K, F>
58where
59 I: Iterator,
60 K: Eq + Hash,
61 F: FnMut(&I::Item) -> K,
62{
63 type Item = I::Item;
64
65 fn next(&mut self) -> Option<I::Item> {
66 self.iter
69 .by_ref()
70 .find(|item| self.seen.insert((self.key)(item)))
71 }
72
73 fn size_hint(&self) -> (usize, Option<usize>) {
74 (0, self.iter.size_hint().1)
75 }
76}