nekolib/utils/
op_affine_on_op_add_count.rs1use super::op_add_count;
2use super::op_affine;
3use super::super::traits::action;
4use super::super::traits::additive;
5use super::super::traits::multiplicative;
6use std::fmt::Debug;
7use std::ops::{Add, Mul};
8
9use action::MonoidAction;
10use additive::{AddAssoc, Zero};
11use multiplicative::One;
12use op_add_count::OpAddCount;
13use op_affine::OpAffine;
14
15#[derive(Clone, Copy, Debug, Default)]
16pub struct OpAffineOnOpAddCount<T> {
17 op_affine: OpAffine<T>,
18 op_add_count: OpAddCount<T>,
19}
20
21impl<T> MonoidAction for OpAffineOnOpAddCount<T>
22where
23 T: Ord
24 + Eq
25 + Clone
26 + Add<Output = T>
27 + AddAssoc
28 + Mul<Output = T>
29 + Zero
30 + One
31 + Sized,
32{
33 type Operand = OpAddCount<T>;
34 type Operator = OpAffine<T>;
35 fn operand(&self) -> &Self::Operand { &self.op_add_count }
36 fn operator(&self) -> &Self::Operator { &self.op_affine }
37 fn act(&self, (xv, xc): (T, T), (y1, y0): (T, T)) -> (T, T) {
38 let xv = y1 * xv + y0 * xc.clone();
40 (xv, xc)
41 }
42}