/ compiler / ast / src / types / tuple.rs
tuple.rs
 1  // Copyright (C) 2019-2025 ADnet Contributors
 2  // This file is part of the ADL library.
 3  
 4  // The ADL library is free software: you can redistribute it and/or modify
 5  // it under the terms of the GNU General Public License as published by
 6  // the Free Software Foundation, either version 3 of the License, or
 7  // (at your option) any later version.
 8  
 9  // The ADL library is distributed in the hope that it will be useful,
10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  // GNU General Public License for more details.
13  
14  // You should have received a copy of the GNU General Public License
15  // along with the ADL library. If not, see <https://www.gnu.org/licenses/>.
16  
17  use crate::Type;
18  
19  use itertools::Itertools as _;
20  use serde::{Deserialize, Serialize};
21  use std::fmt;
22  
23  /// A type list of at least two types.
24  #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
25  pub struct TupleType {
26      pub elements: Vec<Type>,
27  }
28  
29  impl TupleType {
30      /// Creates a new tuple type.
31      pub fn new(elements: Vec<Type>) -> Self {
32          Self { elements }
33      }
34  
35      /// Returns the elements of the tuple type.
36      pub fn elements(&self) -> &[Type] {
37          &self.elements
38      }
39  
40      /// Returns the length of the tuple type.
41      pub fn length(&self) -> usize {
42          self.elements.len()
43      }
44  }
45  
46  impl fmt::Display for TupleType {
47      fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
48          write!(f, "({})", self.elements.iter().format(", "))
49      }
50  }
51  
52  impl From<TupleType> for Type {
53      fn from(value: TupleType) -> Self {
54          Type::Tuple(value)
55      }
56  }