1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use crate::*;

// Kind -----------------------------------------------------------------------

#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub enum Kind {
  Scalar(u64),
  Matrix(Box<Kind>,Vec<usize>),
  Tuple,
  Brace,
  Map,
  Atom,
  Function,
  Fsm,
  Empty,
}

impl Kind {

  pub fn to_value_kind(&self, functions: FunctionsRef) -> MResult<ValueKind> {
    match self {
      Kind::Scalar(id) => {
        match functions.borrow().kinds.get(id).cloned() {
          Some(val_knd) => Ok(val_knd),
          None => Err(MechError{tokens: vec![], msg: file!().to_string(), id: line!(), kind: MechErrorKind::UndefinedKind(*id)}),
        }
      },
      Kind::Matrix(knd,size) => {
        let val_knd = knd.to_value_kind(functions.clone())?;
        Ok(ValueKind::Matrix(Box::new(val_knd),size.clone()))
      },
      Kind::Tuple => todo!(),
      Kind::Brace => todo!(),
      Kind::Map => todo!(),
      Kind::Atom => todo!(),
      Kind::Function => todo!(),
      Kind::Fsm => todo!(),
      Kind::Empty => Ok(ValueKind::Empty),
    }
  }
}