1use core::range::Range;
2use serde::{Deserialize, Serialize};
3
4#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
5pub struct Identifier {
6 pub name: String,
7 #[serde(with = "oak_core::serde_range")]
8 pub span: Range<usize>,
9}
10
11#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
12pub struct HaskellRoot {
13 pub module_name: Option<Identifier>,
14 pub items: Vec<Item>,
15}
16
17#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
18pub enum Item {
19 Function(Function),
20 DataDeclaration(DataDeclaration),
21 TypeAlias(TypeAlias),
22 Import(Import),
23}
24
25#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
26pub struct Function {
27 pub name: Identifier,
28 pub type_signature: Option<Type>,
29 pub equations: Vec<Equation>,
30 #[serde(with = "oak_core::serde_range")]
31 pub span: Range<usize>,
32}
33
34#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
35pub struct Equation {
36 pub patterns: Vec<Pattern>,
37 pub body: Expression,
38}
39
40#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
41pub enum Pattern {
42 Wildcard,
43 Variable(Identifier),
44 Constructor(Identifier, Vec<Pattern>),
45 Literal(Literal),
46}
47
48#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
49pub enum Expression {
50 Variable(Identifier),
51 Literal(Literal),
52 Application(Box<Expression>, Box<Expression>),
53 Lambda(Vec<Pattern>, Box<Expression>),
54 Let(Vec<Item>, Box<Expression>),
55 Case(Box<Expression>, Vec<CaseArm>),
56}
57
58#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
59pub struct CaseArm {
60 pub pattern: Pattern,
61 pub body: Expression,
62}
63
64#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
65pub enum Type {
66 Variable(Identifier),
67 Constructor(Identifier, Vec<Type>),
68 Function(Box<Type>, Box<Type>),
69}
70
71#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
72pub struct DataDeclaration {
73 pub name: Identifier,
74 pub type_params: Vec<Identifier>,
75 pub constructors: Vec<ConstructorDef>,
76}
77
78#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
79pub struct ConstructorDef {
80 pub name: Identifier,
81 pub fields: Vec<Type>,
82}
83
84#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
85pub struct TypeAlias {
86 pub name: Identifier,
87 pub type_params: Vec<Identifier>,
88 pub target: Type,
89}
90
91#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
92pub struct Import {
93 pub module: Identifier,
94 pub qualified: bool,
95 pub as_name: Option<Identifier>,
96}
97
98#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
99pub enum Literal {
100 Integer(i64),
101 Float(f64),
102 String(String),
103 Char(char),
104}