nekolib/utils/
op_closure_on_op_closure.rs1use 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}