Skip to main content

rl_lang/interpreter/stdlib/array/
arr_flatten.rs

1use crate::{
2    interpreter::{evaluator::Evaluator, values::Value},
3    utils::{errors::Error, span::Span},
4};
5
6pub fn std_arr_flatten(eval: &mut Evaluator, array: Value, span: Span) -> Result<Value, Error> {
7    match array {
8        Value::Values { items, items_type } => {
9            if items.is_empty() {
10                return Err(eval.err("arr_flatten() called on empty array".to_string(), span));
11            }
12
13            Ok(Value::Values {
14                items_type,
15                items: items
16                    .into_iter()
17                    .flat_map(|v| {
18                        if let Value::Values { items, .. } = v {
19                            items
20                        } else {
21                            vec![v]
22                        }
23                    })
24                    .collect(),
25            })
26        }
27        _ => Err(eval.err("arr_flatten() accepts only arrays".to_string(), span)),
28    }
29}