1pub use self::{expr::*, kinds::*, ops::*};
10pub use self::{kinds::prelude::*, traits::prelude::*};
11
12pub(crate) mod expr;
13pub(crate) mod ops;
14
15pub(crate) mod kinds {
16
17 pub mod binary;
18 pub mod nary;
19 pub mod ternary;
20 pub mod unary;
21
22 pub(crate) mod prelude {
23 pub use super::binary::{
24 Arithmetic, ArithmeticAssign, BinOp, BinaryArgs, BinaryOp, BinaryParams,
25 };
26 pub use super::nary::NaryOp;
27 pub use super::ternary::{TernaryExpr, TernaryOp};
28 pub use super::unary::UnaryOp;
29 }
30}
31
32pub(crate) mod traits {
33 pub use self::prelude::*;
34
35 pub mod evaluate;
36 pub mod operand;
37 pub mod operator;
38 pub mod params;
39
40 pub(crate) mod prelude {
41 pub use super::evaluate::*;
42 pub use super::operand::*;
43 pub use super::operator::*;
44 pub use super::params::*;
45 }
46}
47
48pub trait IntoOp<F>
49where
50 F: Operator,
51{
52 fn into_op(self) -> F;
53}
54
55impl<S, F> IntoOp<F> for S
56where
57 F: Operator,
58 S: Into<F>,
59{
60 fn into_op(self) -> F {
61 self.into()
62 }
63}
64
65pub(crate) mod prelude {
66 pub use super::IntoOp;
67
68 pub use super::kinds::prelude::*;
69 pub use super::ops::{Op, OpKind};
70 pub use super::traits::prelude::*;
71}
72
73#[cfg(test)]
74mod tests {
75 use super::{Arithmetic, Evaluate, Params};
76
77 #[test]
78 fn test_args() {
79 let args = ();
80 let pattern = args.into_pattern();
81 assert_eq!(pattern, args);
82 let args = (10f64,);
83 let pattern = args.into_pattern();
84 assert_eq!(pattern, args);
85 let args = (0f64, 0f32);
86 let pattern = args.into_pattern();
87 assert_eq!(pattern, args);
88 let args = (0f64, 0f32, 0usize);
89 let pattern = args.into_pattern();
90 assert_eq!(pattern, args);
91 }
92
93 #[test]
94 fn test_arith() {
95 let op = Arithmetic::add();
96 assert_eq!(op.name(), "add");
97 let res = op.eval((1f64, 2f64));
98 assert_eq!(res, 3f64);
99 }
100}