arithmetic_eval/values/
tuple.rs1use core::{fmt, iter::FromIterator, ops};
4
5use crate::{
6 alloc::{vec, Vec},
7 Value,
8};
9
10#[derive(Debug, Clone, PartialEq)]
32pub struct Tuple<T> {
33 elements: Vec<Value<T>>,
34}
35
36impl<T> Default for Tuple<T> {
37 fn default() -> Self {
38 Self::void()
39 }
40}
41
42impl<T> From<Tuple<T>> for Value<T> {
43 fn from(tuple: Tuple<T>) -> Self {
44 Self::Tuple(tuple)
45 }
46}
47
48impl<T> From<Vec<Value<T>>> for Tuple<T> {
49 fn from(elements: Vec<Value<T>>) -> Self {
50 Self { elements }
51 }
52}
53
54impl<T> From<Tuple<T>> for Vec<Value<T>> {
55 fn from(tuple: Tuple<T>) -> Self {
56 tuple.elements
57 }
58}
59
60impl<T: fmt::Display> fmt::Display for Tuple<T> {
61 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
62 write!(formatter, "(")?;
63 for (i, element) in self.iter().enumerate() {
64 fmt::Display::fmt(element, formatter)?;
65 if i + 1 < self.len() {
66 formatter.write_str(", ")?;
67 } else if self.len() == 1 {
68 formatter.write_str(",")?; }
70 }
71 write!(formatter, ")")
72 }
73}
74
75impl<T> Tuple<T> {
76 pub const fn void() -> Self {
78 Self {
79 elements: Vec::new(),
80 }
81 }
82
83 pub fn len(&self) -> usize {
85 self.elements.len()
86 }
87
88 pub fn is_empty(&self) -> bool {
90 self.elements.is_empty()
91 }
92
93 pub fn iter(&self) -> impl Iterator<Item = &Value<T>> + '_ {
95 self.elements.iter()
96 }
97
98 pub fn push(&mut self, value: impl Into<Value<T>>) {
100 self.elements.push(value.into());
101 }
102}
103
104impl<T> ops::Index<usize> for Tuple<T> {
105 type Output = Value<T>;
106
107 fn index(&self, index: usize) -> &Self::Output {
108 &self.elements[index]
109 }
110}
111
112impl<T> IntoIterator for Tuple<T> {
113 type Item = Value<T>;
114 type IntoIter = vec::IntoIter<Value<T>>;
116
117 fn into_iter(self) -> Self::IntoIter {
118 self.elements.into_iter()
119 }
120}
121
122impl<'r, T> IntoIterator for &'r Tuple<T> {
123 type Item = &'r Value<T>;
124 type IntoIter = core::slice::Iter<'r, Value<T>>;
126
127 fn into_iter(self) -> Self::IntoIter {
128 self.elements.iter()
129 }
130}
131
132impl<T, V> FromIterator<V> for Tuple<T>
133where
134 V: Into<Value<T>>,
135{
136 fn from_iter<I: IntoIterator<Item = V>>(iter: I) -> Self {
137 Self {
138 elements: iter.into_iter().map(Into::into).collect(),
139 }
140 }
141}
142
143impl<T, V> Extend<V> for Tuple<T>
144where
145 V: Into<Value<T>>,
146{
147 fn extend<I: IntoIterator<Item = V>>(&mut self, iter: I) {
148 let new_elements = iter.into_iter().map(Into::into);
149 self.elements.extend(new_elements);
150 }
151}
152
153#[cfg(test)]
154mod tests {
155 use super::*;
156
157 #[test]
158 fn tuple_to_string() {
159 let mut tuple = Tuple::<f32>::default();
160 assert_eq!(tuple.to_string(), "()");
161
162 tuple.push(Value::Prim(3.0));
163 assert_eq!(tuple.to_string(), "(3,)");
164
165 tuple.push(Value::Prim(4.0));
166 assert_eq!(tuple.to_string(), "(3, 4)");
167 }
168}