1use super::*;
2
3#[derive(Hash, Debug, Copy, Clone, PartialEq, Eq)]
5pub enum Type {
6 Felt,
8 Vector(usize),
10 Matrix(usize, usize),
12}
13impl Type {
14 #[inline]
16 pub fn is_aggregate(&self) -> bool {
17 match self {
18 Self::Felt => false,
19 Self::Vector(_) | Self::Matrix(_, _) => true,
20 }
21 }
22
23 #[inline]
25 pub fn is_scalar(&self) -> bool {
26 matches!(self, Self::Felt)
27 }
28
29 #[inline]
31 pub fn is_iterable(&self) -> bool {
32 self.is_vector()
33 }
34
35 #[inline]
37 pub fn is_vector(&self) -> bool {
38 matches!(self, Self::Vector(_))
39 }
40
41 pub fn access(&self, access_type: AccessType) -> Result<Self, InvalidAccessError> {
43 match *self {
44 ty if access_type == AccessType::Default => Ok(ty),
45 Self::Felt => Err(InvalidAccessError::IndexIntoScalar),
46 Self::Vector(len) => match access_type {
47 AccessType::Slice(range) => {
48 let slice_range = range.to_slice_range();
49 if slice_range.end > len {
50 Err(InvalidAccessError::IndexOutOfBounds)
51 } else {
52 Ok(Self::Vector(slice_range.len()))
53 }
54 }
55 AccessType::Index(idx) if idx >= len => Err(InvalidAccessError::IndexOutOfBounds),
56 AccessType::Index(_) => Ok(Self::Felt),
57 AccessType::Matrix(_, _) => Err(InvalidAccessError::IndexIntoScalar),
58 _ => unreachable!(),
59 },
60 Self::Matrix(rows, cols) => match access_type {
61 AccessType::Slice(range) => {
62 let slice_range = range.to_slice_range();
63 if slice_range.end > rows {
64 Err(InvalidAccessError::IndexOutOfBounds)
65 } else {
66 Ok(Self::Matrix(slice_range.len(), cols))
67 }
68 }
69 AccessType::Index(idx) if idx >= rows => Err(InvalidAccessError::IndexOutOfBounds),
70 AccessType::Index(_) => Ok(Self::Vector(cols)),
71 AccessType::Matrix(row, col) if row >= rows || col >= cols => {
72 Err(InvalidAccessError::IndexOutOfBounds)
73 }
74 AccessType::Matrix(_, _) => Ok(Self::Felt),
75 _ => unreachable!(),
76 },
77 }
78 }
79}
80impl fmt::Display for Type {
81 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
82 match self {
83 Self::Felt => f.write_str("felt"),
84 Self::Vector(n) => write!(f, "felt[{n}]"),
85 Self::Matrix(rows, cols) => write!(f, "felt[{rows}, {cols}]"),
86 }
87 }
88}
89
90#[derive(Debug, Clone, PartialEq, Eq)]
92pub enum FunctionType {
93 Evaluator(Vec<TraceSegment>),
96 Function(Vec<Type>, Type),
98}
99impl FunctionType {
100 pub fn result(&self) -> Option<Type> {
101 match self {
102 Self::Evaluator(_) => None,
103 Self::Function(_, result) => Some(*result),
104 }
105 }
106}