Skip to main content

rl_lang/interpreter/stdlib/array/
arr_any.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_any(
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_any() 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_any() 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_any() expected function or lambda with Bool return type found {:?}",
37                data.return_type
38            ),
39            span,
40        ));
41    }
42
43    for item in items.clone() {
44        let mapped_item = eval.call_value(function.clone(), vec![item.clone()], span)?;
45        if let Value::Bool(true) = mapped_item {
46            return Ok(Value::Bool(true));
47        }
48    }
49
50    Ok(Value::Bool(false))
51}