reactive_graph_std_arithmetic/behaviour/entity/operation/
function.rs1use reactive_graph_std_arithmetic_model::NAMESPACE_ARITHMETIC_F64;
2use reactive_graph_std_arithmetic_model::NAMESPACE_ARITHMETIC_I64;
3use reactive_graph_std_arithmetic_model::NAMESPACE_ARITHMETIC_U64;
4
5use std::sync::Arc;
6use std::sync::LazyLock;
7
8use crate::behaviour::entity::operation::behaviour_f64::ArithmeticOperationF64Factory;
9use crate::behaviour::entity::operation::behaviour_i64::ArithmeticOperationI64Factory;
10use crate::behaviour::entity::operation::behaviour_u64::ArithmeticOperationU64Factory;
11use reactive_graph_behaviour_model_impl::entity::EntityBehaviourFactoryCreator;
12use reactive_graph_behaviour_model_impl::entity::EntityBehaviourFunctions;
13use reactive_graph_behaviour_model_impl::entity::EntityBehaviourFunctionsStorage;
14
15pub type ArithmeticOperationFunction<T> = fn(T) -> T;
16pub type ArithmeticOperationF64Function = ArithmeticOperationFunction<f64>;
17pub type ArithmeticOperationI64Function = ArithmeticOperationFunction<i64>;
18pub type ArithmeticOperationU64Function = ArithmeticOperationFunction<u64>;
19
20pub const FN_INCREMENT_F64: ArithmeticOperationF64Function = |lhs| lhs + 1.0;
21pub const FN_DECREMENT_F64: ArithmeticOperationF64Function = |lhs| lhs - 1.0;
22
23pub const FN_INCREMENT_I64: ArithmeticOperationI64Function = |lhs| lhs + 1;
24pub const FN_DECREMENT_I64: ArithmeticOperationI64Function = |lhs| lhs - 1;
25
26pub const FN_INCREMENT_U64: ArithmeticOperationU64Function = |lhs| lhs + 1;
27pub const FN_DECREMENT_U64: ArithmeticOperationU64Function = |lhs| lhs - 1;
28
29const FACTORY_CREATOR_F64: EntityBehaviourFactoryCreator<ArithmeticOperationF64Function> = |ty, f| Arc::new(ArithmeticOperationF64Factory::new(ty.clone(), f));
30const FACTORY_CREATOR_I64: EntityBehaviourFactoryCreator<ArithmeticOperationI64Function> = |ty, f| Arc::new(ArithmeticOperationI64Factory::new(ty.clone(), f));
31const FACTORY_CREATOR_U64: EntityBehaviourFactoryCreator<ArithmeticOperationU64Function> = |ty, f| Arc::new(ArithmeticOperationU64Factory::new(ty.clone(), f));
32
33pub static ARITHMETIC_OPERATIONS_F64: EntityBehaviourFunctionsStorage<ArithmeticOperationF64Function> = LazyLock::new(|| {
34 EntityBehaviourFunctions::<ArithmeticOperationF64Function>::with_namespace(NAMESPACE_ARITHMETIC_F64, FACTORY_CREATOR_F64)
35 .behaviour("increment", FN_INCREMENT_F64)
36 .behaviour("decrement", FN_DECREMENT_F64)
37 .get()
38});
39
40pub static ARITHMETIC_OPERATIONS_I64: EntityBehaviourFunctionsStorage<ArithmeticOperationI64Function> = LazyLock::new(|| {
41 EntityBehaviourFunctions::<ArithmeticOperationI64Function>::with_namespace(NAMESPACE_ARITHMETIC_I64, FACTORY_CREATOR_I64)
42 .behaviour("increment", FN_INCREMENT_I64)
43 .behaviour("decrement", FN_DECREMENT_I64)
44 .get()
45});
46
47pub static ARITHMETIC_OPERATIONS_U64: EntityBehaviourFunctionsStorage<ArithmeticOperationU64Function> = LazyLock::new(|| {
48 EntityBehaviourFunctions::<ArithmeticOperationU64Function>::with_namespace(NAMESPACE_ARITHMETIC_U64, FACTORY_CREATOR_U64)
49 .behaviour("increment", FN_INCREMENT_U64)
50 .behaviour("decrement", FN_DECREMENT_U64)
51 .get()
52});
53
54#[cfg(test)]
55mod tests {
56
57 use super::*;
58
59 #[test]
60 fn arithmetic_operation_f64_function_test() {
61 let nv: f64 = 10.0;
62 assert_eq!(11.0, FN_INCREMENT_F64(nv));
63 assert_eq!(9.0, FN_DECREMENT_F64(nv));
64 }
65
66 #[test]
67 fn arithmetic_operation_i64_function_test() {
68 let nv: i64 = -10;
69 assert_eq!(-9, FN_INCREMENT_I64(nv));
70 assert_eq!(-11, FN_DECREMENT_I64(nv));
71 }
72
73 #[test]
74 fn arithmetic_operation_u64_function_test() {
75 let nv: u64 = 10;
76 assert_eq!(11, FN_INCREMENT_U64(nv));
77 assert_eq!(9, FN_DECREMENT_U64(nv));
78 }
79}