rsdiff_core/ops/
mod.rs

1/*
2    Appellation: ops <module>
3    Contrib: FL03 <jo3mccain@icloud.com>
4*/
5//! # Operations
6//!
7//!
8
9pub 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}