logic_mesh/blocks/math/
pow.rs

1// Copyright (c) 2022-2023, Radu Racariu.
2
3use uuid::Uuid;
4
5use crate::base::{
6    block::{Block, BlockDesc, BlockProps, BlockState},
7    input::{input_reader::InputReader, Input, InputProps},
8    output::Output,
9};
10
11use libhaystack::val::{kind::HaystackKind, Number, Value};
12
13use crate::{blocks::InputImpl, blocks::OutputImpl};
14
15/// Outputs the power root value of the input.
16#[block]
17#[derive(BlockProps, Debug)]
18#[dis = "Power"]
19#[category = "math"]
20pub struct Pow {
21    #[input(name = "base", kind = "Number")]
22    pub base: InputImpl,
23    #[input(name = "exponent", kind = "Number")]
24    pub exponent: InputImpl,
25    #[output(kind = "Number")]
26    pub out: OutputImpl,
27}
28
29impl Block for Pow {
30    async fn execute(&mut self) {
31        self.read_inputs_until_ready().await;
32
33        if let (Some(Value::Number(base)), Some(Value::Number(exponent))) =
34            (self.base.get_value(), self.exponent.get_value())
35        {
36            self.out.set(
37                Number {
38                    value: base.value.powf(exponent.value),
39                    unit: base.unit,
40                }
41                .into(),
42            );
43        }
44    }
45}
46
47#[cfg(test)]
48mod test {
49
50    use std::assert_matches::assert_matches;
51
52    use libhaystack::val::{Number, Value};
53
54    use crate::{
55        base::block::test_utils::write_block_inputs,
56        base::{block::Block, input::input_reader::InputReader},
57        blocks::math::Pow,
58    };
59
60    #[tokio::test]
61    async fn test_pow_block() {
62        let mut block = Pow::new();
63
64        for _ in
65            write_block_inputs(&mut [(&mut block.base, 4.into()), (&mut block.exponent, 4.into())])
66                .await
67        {
68            block.read_inputs().await;
69        }
70
71        block.execute().await;
72
73        assert_matches!(
74            block.out.value,
75            Value::Number(Number { value, .. }) if value == 256.0
76        );
77    }
78}