rl_lang/interpreter/stdlib/array/
arr_for_each.rs1use crate::{
2 ast::statements::TypeAnnotation,
3 interpreter::{evaluator::Evaluator, values::Value},
4 utils::{errors::Error, span::Span},
5};
6
7pub fn std_arr_for_each(
8 eval: &mut Evaluator,
9 array: Value,
10 function: Value,
11 span: Span,
12) -> Result<Value, Error> {
13 let (_, items) = match array {
14 Value::Values { items_type, items } => (items_type, items),
15
16 other => {
17 return Err(eval.err(
18 format!(
19 "arr_for_each() accepts only arrays found {}",
20 other.type_name()
21 )
22 .to_string(),
23 span,
24 ));
25 }
26 };
27 let Value::Function(data) = &function else {
28 return Err(eval.err(
29 format!(
30 "arr_for_each() expected function or lambda found {}",
31 function.type_name()
32 ),
33 span,
34 ));
35 };
36
37 if !matches!(data.return_type, Some(TypeAnnotation::Null)) {
38 return Err(eval.err(
39 format!(
40 "arr_for_each() expected function or lambda with no (or null) return type found {:?}",
41 data.return_type
42 ),
43 span,
44 ));
45 }
46
47 for item in items {
48 eval.call_value(function.clone(), vec![item.clone()], span)?;
49 }
50
51 Ok(Value::Null)
52}