1use std::collections::HashMap;
2
3use link::LinkName;
4use types::{Effect, Type};
5
6use crate::{amir::AmirId, block::BlockId, var::VarId};
7
8#[cfg_attr(feature = "withserde", derive(serde::Serialize, serde::Deserialize))]
9#[derive(Clone, Debug, PartialEq)]
10pub struct StmtBind<T = AStmt> {
11 pub var: VarId,
12 pub stmt: T,
13}
14
15#[cfg_attr(feature = "withserde", derive(serde::Serialize, serde::Deserialize))]
16#[derive(Clone, Debug, PartialEq)]
17pub enum AStmt {
18 Const(Const),
19 Product(Vec<VarId>),
20 Array(Vec<VarId>),
21 Set(Vec<VarId>),
22 Fn(FnRef),
23 Perform(VarId),
24 MatchResult(VarId),
25 Apply {
26 function: VarId,
27 arguments: Vec<VarId>,
28 },
29 Op {
30 op: Op,
31 operands: Vec<VarId>,
32 },
33 Cast(VarId),
34 Parameter,
35 Recursion,
36 Link(LinkName),
37}
38
39#[cfg_attr(feature = "withserde", derive(serde::Serialize, serde::Deserialize))]
40#[derive(Clone, Debug, PartialEq)]
41pub enum FnRef {
42 Link(Type),
43 Closure {
44 amir: AmirId,
45 captured: Vec<VarId>,
47 handlers: HashMap<Effect, VarId>,
49 },
50}
51
52#[cfg_attr(feature = "withserde", derive(serde::Serialize, serde::Deserialize))]
53#[derive(Clone, Debug, PartialEq)]
54pub enum Const {
55 Int(i64),
56 Rational(i64, i64),
57 Float(f64),
58 String(String),
59}
60
61#[cfg_attr(feature = "withserde", derive(serde::Serialize, serde::Deserialize))]
62#[derive(Clone, Debug, PartialEq)]
63pub enum Op {
64 Add,
65 Sub,
66 Mul,
67 Div,
68 Rem,
69 Mod,
70 Pow,
71 Eq,
72 Neq,
73 Lt,
74 Le,
75 Gt,
76 Ge,
77 Not,
78 Neg,
79 Pos,
80 Shl,
81 Shr,
82 BitAnd,
83 BitOr,
84 BitXor,
85 BitNot,
86}
87
88#[cfg_attr(feature = "withserde", derive(serde::Serialize, serde::Deserialize))]
89#[derive(Clone, Debug, PartialEq)]
90pub struct MatchCase<T = Type> {
91 pub ty: T,
92 pub next: BlockId,
93}
94
95#[cfg_attr(feature = "withserde", derive(serde::Serialize, serde::Deserialize))]
96#[derive(Clone, Debug, PartialEq)]
97pub enum ATerminator<T = Type> {
98 Return(VarId),
99 Match {
100 var: VarId,
101 cases: Vec<MatchCase<T>>,
102 },
103 Goto(BlockId),
104}
105
106#[cfg_attr(feature = "withserde", derive(serde::Serialize, serde::Deserialize))]
107#[derive(Clone, Debug, PartialEq, Hash, Eq)]
108pub struct ALink<T = Type> {
109 pub name: LinkName,
110 pub ty: T,
111}