reactive_graph_std_arithmetic/behaviour/entity/operation/
function.rs

1use 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}