Skip to main content

nekolib/utils/
op_closure_on_op_closure.rs

1use super::op_closure;
2use super::super::traits::action;
3use std::fmt::Debug;
4
5use action::MonoidAction;
6use op_closure::OpClosure;
7
8#[derive(Clone, Copy, Debug, Default)]
9pub struct OpClosureOnOpClosure<T, OpT, IdT, U, OpU, IdU, Act>
10where
11    OpT: Fn(T, T) -> T,
12    IdT: Fn() -> T,
13    OpU: Fn(U, U) -> U,
14    IdU: Fn() -> U,
15    Act: Fn(T, U) -> T,
16{
17    operator: OpClosure<U, OpU, IdU>,
18    operand: OpClosure<T, OpT, IdT>,
19    act: Act,
20}
21
22impl<T, OpT, IdT, U, OpU, IdU, Act> MonoidAction
23    for OpClosureOnOpClosure<T, OpT, IdT, U, OpU, IdU, Act>
24where
25    T: Eq + Sized,
26    OpT: Fn(T, T) -> T,
27    IdT: Fn() -> T,
28    U: Eq + Sized,
29    OpU: Fn(U, U) -> U,
30    IdU: Fn() -> U,
31    Act: Fn(T, U) -> T,
32{
33    type Operand = OpClosure<T, OpT, IdT>;
34    type Operator = OpClosure<U, OpU, IdU>;
35    fn operand(&self) -> &Self::Operand { &self.operand }
36    fn operator(&self) -> &Self::Operator { &self.operator }
37    fn act(&self, x: T, op: U) -> T { (self.act)(x, op) }
38}
39
40impl<T, OpT, IdT, U, OpU, IdU, Act>
41    OpClosureOnOpClosure<T, OpT, IdT, U, OpU, IdU, Act>
42where
43    T: Eq + Sized,
44    OpT: Fn(T, T) -> T,
45    IdT: Fn() -> T,
46    U: Eq + Sized,
47    OpU: Fn(U, U) -> U,
48    IdU: Fn() -> U,
49    Act: Fn(T, U) -> T,
50{
51    pub fn new(
52        operand: OpClosure<T, OpT, IdT>,
53        operator: OpClosure<U, OpU, IdU>,
54        act: Act,
55    ) -> Self {
56        Self { operand, operator, act }
57    }
58}