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