minhash_rs/
intersection.rs1use std::ops::{BitAnd, BitAndAssign};
2
3use crate::prelude::{Maximal, Min, MinHash};
4
5impl<Word: Min + Clone + Eq, const PERMUTATATIONS: usize> BitAndAssign<&Self>
6 for MinHash<Word, PERMUTATATIONS>
7{
8 fn bitand_assign(&mut self, rhs: &Self) {
9 self.iter_mut().zip(rhs.iter()).for_each(|(left, right)| {
10 left.set_min(right.clone());
11 });
12 }
13}
14
15impl<Word: Min + Clone + Eq, const PERMUTATATIONS: usize> BitAndAssign<Self>
16 for MinHash<Word, PERMUTATATIONS>
17{
18 fn bitand_assign(&mut self, rhs: Self) {
19 self.bitand_assign(&rhs);
20 }
21}
22
23impl<Word: Min + Clone + Eq, const PERMUTATATIONS: usize> BitAnd for MinHash<Word, PERMUTATATIONS> {
24 type Output = Self;
25
26 fn bitand(mut self, rhs: Self) -> Self::Output {
27 self.bitand_assign(rhs);
28 self
29 }
30}
31
32impl<Word: Min + Clone + Eq, const PERMUTATATIONS: usize> BitAnd<&Self>
33 for MinHash<Word, PERMUTATATIONS>
34{
35 type Output = Self;
36
37 fn bitand(mut self, rhs: &Self) -> Self::Output {
38 self.bitand_assign(rhs);
39 self
40 }
41}
42
43pub trait MinHashIterator<Word: Min + Eq, const PERMUTATIONS: usize> {
44 fn intersection(self) -> MinHash<Word, PERMUTATIONS>;
52}
53
54impl<
55 Word: Maximal + Min + Eq,
56 const PERMUTATIONS: usize,
57 I: Iterator<Item = MinHash<Word, PERMUTATIONS>>,
58 > MinHashIterator<Word, PERMUTATIONS> for I
59{
60 fn intersection(self) -> MinHash<Word, PERMUTATIONS> {
61 let mut result: MinHash<Word, PERMUTATIONS> = MinHash::default();
62 for minhash in self {
63 result &= minhash;
64 }
65 result
66 }
67}