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