1use crate::*;
2
3#[derive(Clone, Debug, PartialEq, Eq, Hash)]
6pub enum Kind {
7 Tuple(Vec<Kind>),
8 Matrix(Box<Kind>,Vec<usize>),
9 Set(Box<Kind>,usize),
10 Map(Box<Kind>,Box<Kind>),
11 Table(Vec<Kind>,usize),
12 Record(Vec<Kind>),
13 Enum(u64),
14 Scalar(u64),
15 Atom(u64),
16 Function(Vec<Kind>,Vec<Kind>),
17 Reference(Box<Kind>),
18 Fsm(Vec<Kind>,Vec<Kind>),
19 Id,
20 Index,
21 Empty,
22 Any,
23}
24
25impl Kind {
26
27 pub fn to_value_kind(&self, functions: FunctionsRef) -> MResult<ValueKind> {
28 match self {
29 Kind::Scalar(id) => {
30 match functions.borrow().kinds.get(id).cloned() {
31 Some(val_knd) => Ok(val_knd),
32 None => Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::UndefinedKind(*id)}),
33 }
34 },
35 Kind::Matrix(knd,size) => {
36 let val_knd = knd.to_value_kind(functions.clone())?;
37 Ok(ValueKind::Matrix(Box::new(val_knd),size.clone()))
38 },
39 Kind::Tuple(elements) => {
40 let val_knds = elements.iter().map(|k| k.to_value_kind(functions.clone())).collect::<MResult<Vec<ValueKind>>>()?;
41 Ok(ValueKind::Tuple(val_knds))
42 }
43 Kind::Set(kind,size) => {
44 let val_knd = kind.to_value_kind(functions.clone())?;
45 Ok(ValueKind::Set(Box::new(val_knd),*size))
46 }
47 Kind::Map(keys,vals) => {
48 let key_knd = keys.to_value_kind(functions.clone())?;
49 let val_knd = vals.to_value_kind(functions.clone())?;
50 Ok(ValueKind::Map(Box::new(key_knd),Box::new(val_knd)))
51 },
52 Kind::Table(elements,size) => {
53 let val_knds = elements.iter().map(|k| k.to_value_kind(functions.clone())).collect::<MResult<Vec<ValueKind>>>()?;
54 Ok(ValueKind::Table(val_knds,*size))
55 },
56 Kind::Record(elements) => {
57 let val_knds = elements.iter().map(|k| k.to_value_kind(functions.clone())).collect::<MResult<Vec<ValueKind>>>()?;
58 Ok(ValueKind::Record(val_knds))
59 },
60 Kind::Enum(id) => Ok(ValueKind::Enum(*id)),
61 Kind::Atom(id) => Ok(ValueKind::Atom(*id)),
62 Kind::Reference(kind) => {
63 let val_knd = kind.to_value_kind(functions.clone())?;
64 Ok(ValueKind::Reference(Box::new(val_knd)))
65 },
66 Kind::Id => Ok(ValueKind::Id),
67 Kind::Index => Ok(ValueKind::Index),
68 Kind::Empty => Ok(ValueKind::Empty),
69 Kind::Any => Ok(ValueKind::Any),
70 _ => todo!(),
71 }
72 }
73}