reactive_graph_std_numeric/behaviour/entity/operation/
function.rs

1use reactive_graph_std_numeric_model::NAMESPACE_NUMERIC_F64;
2use reactive_graph_std_numeric_model::NAMESPACE_NUMERIC_I64;
3
4use std::sync::Arc;
5use std::sync::LazyLock;
6
7use crate::behaviour::entity::operation::behaviour_f64::NumericOperationF64Factory;
8use crate::behaviour::entity::operation::behaviour_i64::NumericOperationI64Factory;
9use reactive_graph_behaviour_model_impl::entity::EntityBehaviourFactoryCreator;
10use reactive_graph_behaviour_model_impl::entity::EntityBehaviourFunctions;
11use reactive_graph_behaviour_model_impl::entity::EntityBehaviourFunctionsStorage;
12
13pub type NumericOperationFunction<I, O> = fn(I) -> O;
14pub type NumericOperationF64Function = NumericOperationFunction<f64, f64>;
15pub type NumericOperationI64Function = NumericOperationFunction<i64, i64>;
16
17pub const FN_ABS_F64: NumericOperationF64Function = |lhs: f64| lhs.abs();
18pub const FN_ACOS_F64: NumericOperationF64Function = |lhs: f64| lhs.acos();
19pub const FN_ASIN_F64: NumericOperationF64Function = |lhs: f64| lhs.asin();
20pub const FN_ATAN_F64: NumericOperationF64Function = |lhs: f64| lhs.atan();
21pub const FN_CBRT_F64: NumericOperationF64Function = |lhs: f64| lhs.cbrt();
22pub const FN_CEIL_F64: NumericOperationF64Function = |lhs: f64| lhs.ceil();
23pub const FN_COS_F64: NumericOperationF64Function = |lhs: f64| lhs.cos();
24pub const FN_COSH_F64: NumericOperationF64Function = |lhs: f64| lhs.cosh();
25pub const FN_EXP_F64: NumericOperationF64Function = |lhs: f64| lhs.exp();
26pub const FN_EXP2_F64: NumericOperationF64Function = |lhs: f64| lhs.exp2();
27pub const FN_FLOOR_F64: NumericOperationF64Function = |lhs: f64| lhs.floor();
28pub const FN_FRACT_F64: NumericOperationF64Function = |lhs: f64| lhs.fract();
29pub const FN_LN_F64: NumericOperationF64Function = |lhs: f64| lhs.ln();
30pub const FN_LOG2_F64: NumericOperationF64Function = |lhs: f64| lhs.log2();
31pub const FN_LOG10_F64: NumericOperationF64Function = |lhs: f64| lhs.log10();
32pub const FN_RECIP_F64: NumericOperationF64Function = |lhs: f64| lhs.recip();
33pub const FN_ROUND_F64: NumericOperationF64Function = |lhs: f64| lhs.round();
34pub const FN_SIGNUM_F64: NumericOperationF64Function = |lhs: f64| lhs.signum();
35pub const FN_SIN_F64: NumericOperationF64Function = |lhs: f64| lhs.sin();
36pub const FN_SINH_F64: NumericOperationF64Function = |lhs: f64| lhs.sinh();
37pub const FN_SQRT_F64: NumericOperationF64Function = |lhs: f64| lhs.sqrt();
38pub const FN_TAN_F64: NumericOperationF64Function = |lhs: f64| lhs.tan();
39pub const FN_TANH_F64: NumericOperationF64Function = |lhs: f64| lhs.tanh();
40pub const FN_TO_DEGREES_F64: NumericOperationF64Function = |lhs: f64| lhs.to_degrees();
41pub const FN_TO_RADIANS_F64: NumericOperationF64Function = |lhs: f64| lhs.to_radians();
42pub const FN_TRUNC_F64: NumericOperationF64Function = |lhs: f64| lhs.trunc();
43
44pub const FN_ABS_I64: NumericOperationI64Function = |lhs: i64| lhs.abs();
45pub const FN_SIGNUM_I64: NumericOperationI64Function = |lhs: i64| lhs.signum();
46
47const FACTORY_CREATOR_F64: EntityBehaviourFactoryCreator<NumericOperationF64Function> = |ty, f| Arc::new(NumericOperationF64Factory::new(ty.clone(), f));
48const FACTORY_CREATOR_I64: EntityBehaviourFactoryCreator<NumericOperationI64Function> = |ty, f| Arc::new(NumericOperationI64Factory::new(ty.clone(), f));
49
50pub static NUMERIC_OPERATIONS_F64: EntityBehaviourFunctionsStorage<NumericOperationF64Function> = LazyLock::new(|| {
51    EntityBehaviourFunctions::<NumericOperationF64Function>::with_namespace(NAMESPACE_NUMERIC_F64, FACTORY_CREATOR_F64)
52        .behaviour("abs", FN_ABS_F64)
53        .behaviour("acos", FN_ACOS_F64)
54        .behaviour("asin", FN_ASIN_F64)
55        .behaviour("atan", FN_ATAN_F64)
56        .behaviour("cbrt", FN_CBRT_F64)
57        .behaviour("ceil", FN_CEIL_F64)
58        .behaviour("cos", FN_COS_F64)
59        .behaviour("cosh", FN_COSH_F64)
60        .behaviour("exp", FN_EXP_F64)
61        .behaviour("exp2", FN_EXP2_F64)
62        .behaviour("floor", FN_FLOOR_F64)
63        .behaviour("fract", FN_FRACT_F64)
64        .behaviour("ln", FN_LN_F64)
65        .behaviour("log2", FN_LOG2_F64)
66        .behaviour("log10", FN_LOG10_F64)
67        .behaviour("recip", FN_RECIP_F64)
68        .behaviour("round", FN_ROUND_F64)
69        .behaviour("signum", FN_SIGNUM_F64)
70        .behaviour("sin", FN_SIN_F64)
71        .behaviour("sinh", FN_SINH_F64)
72        .behaviour("sqrt", FN_SQRT_F64)
73        .behaviour("tan", FN_TAN_F64)
74        .behaviour("tanh", FN_TANH_F64)
75        .behaviour("to_degrees", FN_TO_DEGREES_F64)
76        .behaviour("to_radians", FN_TO_RADIANS_F64)
77        .behaviour("trunc", FN_TRUNC_F64)
78        .get()
79});
80
81pub static NUMERIC_OPERATIONS_I64: EntityBehaviourFunctionsStorage<NumericOperationI64Function> = LazyLock::new(|| {
82    EntityBehaviourFunctions::<NumericOperationI64Function>::with_namespace(NAMESPACE_NUMERIC_I64, FACTORY_CREATOR_I64)
83        .behaviour("abs", FN_ABS_I64)
84        .behaviour("signum", FN_SIGNUM_I64)
85        .get()
86});
87
88#[cfg(test)]
89mod tests {
90    use super::*;
91
92    #[test]
93    fn numeric_operation_function_test() {
94        let nv: f64 = -0.5;
95        let pv: f64 = 0.5;
96        assert_eq!(nv.abs(), FN_ABS_F64(nv));
97        assert_eq!(pv.acos(), FN_ACOS_F64(pv));
98        assert_eq!(nv.asin(), FN_ASIN_F64(nv));
99        assert_eq!(nv.atan(), FN_ATAN_F64(nv));
100        assert_eq!(nv.cbrt(), FN_CBRT_F64(nv));
101        assert_eq!(nv.ceil(), FN_CEIL_F64(nv));
102        assert_eq!(nv.cos(), FN_COS_F64(nv));
103        assert_eq!(nv.cosh(), FN_COSH_F64(nv));
104        assert_eq!(nv.exp(), FN_EXP_F64(nv));
105        assert_eq!(nv.exp2(), FN_EXP2_F64(nv));
106        assert_eq!(nv.floor(), FN_FLOOR_F64(nv));
107        assert_eq!(nv.fract(), FN_FRACT_F64(nv));
108        assert_eq!(pv.ln(), FN_LN_F64(pv));
109        assert_eq!(pv.log2(), FN_LOG2_F64(pv));
110        assert_eq!(pv.log10(), FN_LOG10_F64(pv));
111        assert_eq!(nv.recip(), FN_RECIP_F64(nv));
112        assert_eq!(nv.round(), FN_ROUND_F64(nv));
113        assert_eq!(nv.signum(), FN_SIGNUM_F64(nv));
114        assert_eq!(nv.sin(), FN_SIN_F64(nv));
115        assert_eq!(nv.sinh(), FN_SINH_F64(nv));
116        assert_eq!(pv.sqrt(), FN_SQRT_F64(pv));
117        assert_eq!(nv.tan(), FN_TAN_F64(nv));
118        assert_eq!(nv.tanh(), FN_TANH_F64(nv));
119        assert_eq!(nv.to_degrees(), FN_TO_DEGREES_F64(nv));
120        assert_eq!(nv.to_radians(), FN_TO_RADIANS_F64(nv));
121        assert_eq!(nv.trunc(), FN_TRUNC_F64(nv));
122    }
123}