cp_library_rs/algebraic_structure/
actedmonoid_with_size.rs1use std::ops::{Add, Mul};
4
5use num::{Bounded, FromPrimitive, Zero};
6
7use crate::algebraic_structure::{
8 actedmonoid::{
9 examples::{AddMin, AddSum, UpdateMax, UpdateMin, UpdateMinMax, UpdateSum},
10 ActedMonoid,
11 },
12 monoid::Monoid,
13 to_acted::ToActed,
14};
15
16pub trait ActedMonoidWithSize: ActedMonoid {
18 #[inline]
22 fn e_with_size(_size: usize) -> Self::Val {
23 Self::e()
24 }
25}
26
27impl<T> ActedMonoidWithSize for AddSum<T>
29where
30 T: Zero + Clone + Add<Output = T> + Mul<Output = T> + FromPrimitive + PartialEq,
31{
32 fn e_with_size(size: usize) -> Self::Val {
33 (T::zero(), size)
34 }
35}
36
37impl<T> ActedMonoidWithSize for UpdateSum<T>
38where
39 T: Zero + Clone + Add<Output = T> + Mul<Output = T> + FromPrimitive + PartialEq,
40{
41 fn e_with_size(size: usize) -> Self::Val {
42 (T::zero(), size)
43 }
44}
45
46impl<M> ActedMonoidWithSize for ToActed<M>
48where
49 M: Monoid,
50 M::Val: PartialEq,
51{
52}
53impl<T: Bounded + Ord + Clone> ActedMonoidWithSize for UpdateMin<T> {}
54impl<T: Bounded + Ord + Clone> ActedMonoidWithSize for UpdateMax<T> {}
55impl<T: Bounded + Ord + Clone> ActedMonoidWithSize for UpdateMinMax<T> {}
56impl<T> ActedMonoidWithSize for AddMin<T> where T: Zero + Clone + Add<Output = T> + Ord + Bounded {}