microcad_lang/value/
value_list.rs

1// Copyright © 2024-2025 The µcad authors <info@ucad.xyz>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4//! Value list evaluation entity
5
6use crate::{ty::*, value::*};
7use derive_more::{Deref, DerefMut};
8
9/// List of values
10#[derive(Clone, Default, Deref, DerefMut)]
11pub struct ValueList(Vec<Value>);
12
13impl ValueList {
14    /// Create new value list.
15    pub fn new(list: Vec<Value>) -> Self {
16        Self(list)
17    }
18
19    /// Return list with types of values.
20    pub fn types(&self) -> TypeList {
21        TypeList::new(
22            self.0
23                .iter()
24                .map(|v| v.ty())
25                .collect::<Vec<Type>>()
26                .into_iter()
27                .collect(),
28        )
29    }
30}
31
32impl IntoIterator for ValueList {
33    type Item = Value;
34    type IntoIter = std::vec::IntoIter<Self::Item>;
35
36    fn into_iter(self) -> Self::IntoIter {
37        self.0.into_iter()
38    }
39}
40
41impl PartialEq for ValueList {
42    fn eq(&self, other: &Self) -> bool {
43        self.0 == other.0
44    }
45}
46
47impl std::iter::FromIterator<Value> for ValueList {
48    fn from_iter<T: IntoIterator<Item = Value>>(iter: T) -> Self {
49        let vec = Vec::from_iter(iter);
50        ValueList(vec)
51    }
52}
53
54impl std::fmt::Debug for ValueList {
55    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
56        write!(
57            f,
58            "{}",
59            self.iter()
60                .map(|value| format!("{value}"))
61                .collect::<Vec<_>>()
62                .join(", ")
63        )
64    }
65}