pub type Program = Vec<SpPExpr>;
type GenericParams = Vec<(bool, String)>;
use super::span::*;
use std::collections::VecDeque;
#[derive(Debug, PartialEq, Clone)]
pub enum PExpr {
Bool(bool),
Int(i64),
Float(f64),
String(String),
Unit,
BinOp(SpPExpr, Opcode, SpPExpr),
UnOp(Opcode, SpPExpr),
List(VecDeque<SpPExpr>),
StructExpr(Vec<String>, String, Vec<(String, SpPExpr)>),
Tuple(Vec<SpPExpr>),
Fn(Vec<SpPattern>, SpPExpr),
If(SpPExpr, SpPExpr, SpPExpr),
Block(Vec<SpPExpr>),
App(SpPExpr, SpPExpr),
ProjStruct(SpPExpr, String),
Variant(Vec<String>, String, Option<SpPExpr>), Match(SpPExpr, Vec<(SpPattern, SpPExpr)>),
Var(Vec<String>, String),
TypeDef(String, Vec<String>, SpTypeExpr), StructDef(String, Vec<String>, Vec<(String, SpTypeExpr)>), EnumDef(String, Vec<String>, Vec<(String, Option<SpTypeExpr>)>), Let(SpPattern, SpPExpr),
LetAndWith(SpPattern, SpPExpr, SpPattern, SpPExpr, SpPExpr),
Use(Vec<String>, bool), }
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum Opcode {
Mul,
Div,
Add,
Sub,
Mod,
Cons,
Stream,
Eq,
Lt,
Gt,
And,
Or,
Neg,
Not,
Delay, Stable, Adv, Unbox, Out, Into, }
#[derive(Debug, PartialEq, Clone)]
pub enum TypeExpr {
TEUnit,
TEInt,
TEFloat,
TEString,
TEBool,
TETuple(Vec<SpTypeExpr>),
TEList(SpTypeExpr),
TEUser(Vec<String>, String, Vec<SpTypeExpr>), TEFunction(SpTypeExpr, SpTypeExpr),
TEDelay(SpTypeExpr), TEStable(SpTypeExpr), }
#[derive(Debug, PartialEq, Clone)]
pub enum Pattern {
Underscore,
Bool(bool),
Int(i64),
Float(f64),
String(String),
Unit,
Tuple(Vec<SpPattern>),
List(Vec<SpPattern>),
Variant(Vec<String>, String, Option<SpPattern>),
Struct(Vec<String>, String, Vec<(String, Option<SpPattern>)>),
Cons(SpPattern, SpPattern),
Stream(SpPattern, SpPattern),
Or(SpPattern, SpPattern),
Var(String, bool),
}