1use std::collections::HashSet;
2use std::hash::BuildHasher;
3use std::iter::FromIterator;
4
5use crate::{IntoParallelIterator, ParallelDrainFull};
6
7impl<'a, I, S> IntoParallelIterator<'a> for HashSet<I, S>
8where
9 I: Send + 'a,
10 S: BuildHasher,
11{
12 type Iter = <Vec<I> as IntoParallelIterator<'a>>::Iter;
13 type Item = I;
14
15 fn into_par_iter(self) -> Self::Iter {
16 let vec = Vec::from_iter(self);
17
18 vec.into_par_iter()
19 }
20}
21
22impl<'a, I, S> IntoParallelIterator<'a> for &'a HashSet<I, S>
23where
24 I: Send + Sync + 'a,
25 S: BuildHasher,
26{
27 type Iter = <Vec<&'a I> as IntoParallelIterator<'a>>::Iter;
28 type Item = &'a I;
29
30 fn into_par_iter(self) -> Self::Iter {
31 let vec = Vec::<&'a I>::from_iter(self);
32
33 vec.into_par_iter()
34 }
35}
36
37impl<'a, I, S> ParallelDrainFull<'a> for &'a mut HashSet<I, S>
38where
39 I: Send + 'a,
40 S: BuildHasher,
41{
42 type Iter = <Vec<I> as IntoParallelIterator<'a>>::Iter;
43 type Item = I;
44
45 fn par_drain(self) -> Self::Iter {
46 let vec = self.drain().collect::<Vec<_>>();
47
48 vec.into_par_iter()
49 }
50}