reactive_graph_std_numeric/behaviour/entity/operation/
function.rs1use 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}