1#![doc = include_str!("readme.md")]
2use core::range::Range;
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6#[derive(Clone, Debug, PartialEq, Eq, Hash)]
8#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
9pub struct Identifier {
10 pub name: String,
12 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
14 pub span: Range<usize>,
15}
16
17#[derive(Clone, Debug, PartialEq)]
19#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
20pub struct HaskellRoot {
21 pub module_name: Option<Identifier>,
23 pub items: Vec<Item>,
25}
26
27#[derive(Clone, Debug, PartialEq)]
29#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
30pub enum Item {
31 Function(Function),
33 DataDeclaration(DataDeclaration),
35 TypeAlias(TypeAlias),
37 Import(Import),
39}
40
41#[derive(Clone, Debug, PartialEq)]
43#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
44pub struct Function {
45 pub name: Identifier,
47 pub type_signature: Option<Type>,
49 pub equations: Vec<Equation>,
51 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
53 pub span: Range<usize>,
54}
55
56#[derive(Clone, Debug, PartialEq)]
58#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
59pub struct Equation {
60 pub patterns: Vec<Pattern>,
62 pub body: Expression,
64}
65
66#[derive(Clone, Debug, PartialEq)]
68#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
69pub enum Pattern {
70 Wildcard,
72 Variable(Identifier),
74 Constructor(Identifier, Vec<Pattern>),
76 Literal(Literal),
78}
79
80#[derive(Clone, Debug, PartialEq)]
82#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
83pub enum Expression {
84 Variable(Identifier),
86 Literal(Literal),
88 Application(Box<Expression>, Box<Expression>),
90 Lambda(Vec<Pattern>, Box<Expression>),
92 Let(Vec<Item>, Box<Expression>),
94 Case(Box<Expression>, Vec<CaseArm>),
96}
97
98#[derive(Clone, Debug, PartialEq)]
100#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
101pub struct CaseArm {
102 pub pattern: Pattern,
104 pub body: Expression,
106}
107
108#[derive(Clone, Debug, PartialEq)]
110#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
111pub enum Type {
112 Variable(Identifier),
114 Constructor(Identifier, Vec<Type>),
116 Function(Box<Type>, Box<Type>),
118}
119
120#[derive(Clone, Debug, PartialEq)]
122#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
123pub struct DataDeclaration {
124 pub name: Identifier,
126 pub type_params: Vec<Identifier>,
128 pub constructors: Vec<ConstructorDef>,
130}
131
132#[derive(Clone, Debug, PartialEq)]
134#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
135pub struct ConstructorDef {
136 pub name: Identifier,
138 pub fields: Vec<Type>,
140}
141
142#[derive(Clone, Debug, PartialEq)]
144#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
145pub struct TypeAlias {
146 pub name: Identifier,
148 pub type_params: Vec<Identifier>,
150 pub target: Type,
152}
153
154#[derive(Clone, Debug, PartialEq)]
156#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
157pub struct Import {
158 pub module: Identifier,
160 pub qualified: bool,
162 pub as_name: Option<Identifier>,
164}
165
166#[derive(Clone, Debug, PartialEq)]
168#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
169pub enum Literal {
170 Integer(i64),
172 Float(f64),
174 String(String),
176 Char(char),
178}