rl_lang/interpreter/stdlib/array/
arr_find.rs1use crate::{
2 ast::statements::TypeAnnotation,
3 interpreter::{evaluator::Evaluator, values::Value},
4 utils::{errors::Error, span::Span},
5};
6
7pub fn std_arr_find(
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!("arr_find() accepts only arrays found {}", other.type_name()).to_string(),
19 span,
20 ));
21 }
22 };
23 let Value::Function(data) = &function else {
24 return Err(eval.err(
25 format!(
26 "arr_find() expected function or lambda found {}",
27 function.type_name()
28 ),
29 span,
30 ));
31 };
32
33 if !matches!(data.return_type, Some(TypeAnnotation::Bool)) {
34 return Err(eval.err(
35 format!(
36 "arr_find() expected function or lambda with Bool return type found {:?}",
37 data.return_type
38 ),
39 span,
40 ));
41 }
42
43 for item in items {
44 let mapped_item = eval.call_value(function.clone(), vec![item.clone()], span)?;
45 if let Value::Bool(true) = mapped_item {
46 return Ok(item);
47 }
48 }
49
50 Ok(Value::Null)
51}