haar_lib/algebra/
min_count.rs1use crate::algebra::traits::*;
3use crate::num::one_zero::Zero;
4use std::{cmp::Ordering, marker::PhantomData, ops::Add};
5
6#[derive(Copy, Clone, Default, Debug, PartialEq, Eq, Hash)]
8pub struct MinCount<T, U>(PhantomData<(T, U)>);
9impl<T, U> MinCount<T, U> {
10 pub fn new() -> Self {
12 Self(PhantomData)
13 }
14}
15
16impl<T, U> Set for MinCount<T, U> {
17 type Element = (Option<T>, U);
18}
19impl<T: Ord, U: Add<Output = U>> BinaryOp for MinCount<T, U> {
20 fn op(&self, a: Self::Element, b: Self::Element) -> Self::Element {
21 match (a, b) {
22 ((None, ca), (None, cb)) => (None, ca + cb),
23 ((None, _), a) => a,
24 (b, (None, _)) => b,
25 ((Some(a), ca), (Some(b), cb)) => match a.cmp(&b) {
26 Ordering::Equal => (Some(a), ca + cb),
27 Ordering::Less => (Some(a), ca),
28 Ordering::Greater => (Some(b), cb),
29 },
30 }
31 }
32}
33impl<T, U: Zero + PartialEq> Identity for MinCount<T, U> {
34 fn id(&self) -> Self::Element {
35 (None, U::zero())
36 }
37}
38impl<T, U> Associative for MinCount<T, U> {}
39impl<T, U> Commutative for MinCount<T, U> {}