Skip to main content

nekolib/utils/
op_add_on_op_add_count.rs

1use 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}