minhash_rs/
intersection.rs

1use 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    /// Returns a MinHash that is the intersection of all MinHashes in the iterator.
45    ///
46    /// # Example
47    ///
48    /// ```rust
49    /// use minhash_rs::prelude::*;
50    /// ```
51    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}