1#![doc = include_str!("readme.md")]
2use core::range::Range;
3
4#[derive(Clone, Debug, PartialEq, Eq, Hash)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7pub struct Identifier {
8 pub name: String,
10 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
12 pub span: Range<usize>,
13}
14
15#[derive(Clone, Debug, PartialEq)]
17#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18pub struct HaskellRoot {
19 pub module_name: Option<Identifier>,
21 pub items: Vec<Item>,
23}
24
25#[derive(Clone, Debug, PartialEq)]
27#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
28pub enum Item {
29 Function(Function),
31 DataDeclaration(DataDeclaration),
33 TypeAlias(TypeAlias),
35 Import(Import),
37}
38
39#[derive(Clone, Debug, PartialEq)]
41#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
42pub struct Function {
43 pub name: Identifier,
45 pub type_signature: Option<Type>,
47 pub equations: Vec<Equation>,
49 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
51 pub span: Range<usize>,
52}
53
54#[derive(Clone, Debug, PartialEq)]
56#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
57pub struct Equation {
58 pub patterns: Vec<Pattern>,
60 pub body: Expression,
62}
63
64#[derive(Clone, Debug, PartialEq)]
66#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
67pub enum Pattern {
68 Wildcard,
70 Variable(Identifier),
72 Constructor(Identifier, Vec<Pattern>),
74 Literal(Literal),
76}
77
78#[derive(Clone, Debug, PartialEq)]
80#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
81pub enum Expression {
82 Variable(Identifier),
84 Literal(Literal),
86 Application(Box<Expression>, Box<Expression>),
88 Lambda(Vec<Pattern>, Box<Expression>),
90 Let(Vec<Item>, Box<Expression>),
92 Case(Box<Expression>, Vec<CaseArm>),
94}
95
96#[derive(Clone, Debug, PartialEq)]
98#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
99pub struct CaseArm {
100 pub pattern: Pattern,
102 pub body: Expression,
104}
105
106#[derive(Clone, Debug, PartialEq)]
108#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
109pub enum Type {
110 Variable(Identifier),
112 Constructor(Identifier, Vec<Type>),
114 Function(Box<Type>, Box<Type>),
116}
117
118#[derive(Clone, Debug, PartialEq)]
120#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
121pub struct DataDeclaration {
122 pub name: Identifier,
124 pub type_params: Vec<Identifier>,
126 pub constructors: Vec<ConstructorDef>,
128}
129
130#[derive(Clone, Debug, PartialEq)]
132#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
133pub struct ConstructorDef {
134 pub name: Identifier,
136 pub fields: Vec<Type>,
138}
139
140#[derive(Clone, Debug, PartialEq)]
142#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
143pub struct TypeAlias {
144 pub name: Identifier,
146 pub type_params: Vec<Identifier>,
148 pub target: Type,
150}
151
152#[derive(Clone, Debug, PartialEq)]
154#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
155pub struct Import {
156 pub module: Identifier,
158 pub qualified: bool,
160 pub as_name: Option<Identifier>,
162}
163
164#[derive(Clone, Debug, PartialEq)]
166#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
167pub enum Literal {
168 Integer(i64),
170 Float(f64),
172 String(String),
174 Char(char),
176}