haar_lib/algebra/
min_count.rs

1//! 最小値とその個数の総和
2use crate::algebra::traits::*;
3use crate::num::one_zero::Zero;
4use std::{cmp::Ordering, marker::PhantomData, ops::Add};
5
6/// 最小値とその個数の総和
7#[derive(Copy, Clone, Default, Debug, PartialEq, Eq, Hash)]
8pub struct MinCount<T, U>(PhantomData<(T, U)>);
9impl<T, U> MinCount<T, U> {
10    /// [`MinCount<T, U>`]を返す。
11    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> {}