Skip to main content

rl_lang/interpreter/stdlib/array/
arr_product.rs

1use crate::{
2    ast::statements::TypeAnnotation,
3    interpreter::{evaluator::Evaluator, values::Value},
4    utils::{errors::Error, span::Span},
5};
6
7pub fn std_arr_product(eval: &mut Evaluator, array: Value, span: Span) -> Result<Value, Error> {
8    match array {
9        Value::Values { items, items_type } => match items_type {
10            TypeAnnotation::Int => {
11                let product = items
12                    .into_iter()
13                    .filter_map(|v| {
14                        if let Value::Integer(i) = v {
15                            Some(i)
16                        } else {
17                            None
18                        }
19                    })
20                    .product::<i64>();
21                Ok(Value::Integer(product))
22            }
23            TypeAnnotation::Float => {
24                let product = items
25                    .into_iter()
26                    .filter_map(|v| {
27                        if let Value::Float(f) = v {
28                            Some(f)
29                        } else {
30                            None
31                        }
32                    })
33                    .sum::<f64>();
34                Ok(Value::Float(product))
35            }
36            _ => Err(eval.err(
37                "arr_product() accepts only int or float arrays".to_string(),
38                span,
39            )),
40        },
41        _ => Err(eval.err("arr_product() accepts only arrays".to_string(), span)),
42    }
43}