rl_lang/interpreter/stdlib/array/
arr_sum.rs1use crate::{
2 ast::statements::TypeAnnotation,
3 interpreter::{evaluator::Evaluator, values::Value},
4 utils::{errors::Error, span::Span},
5};
6
7pub fn std_arr_sum(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 sum = 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 .sum::<i64>();
21 Ok(Value::Integer(sum))
22 }
23 TypeAnnotation::Float => {
24 let sum = 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(sum))
35 }
36 _ => Err(eval.err(
37 "arr_sum() accepts only int or float arrays".to_string(),
38 span,
39 )),
40 },
41 _ => Err(eval.err("arr_sum() accepts only arrays".to_string(), span)),
42 }
43}