1pub mod arena;
2pub mod binder;
3pub mod bls;
4pub mod builtin;
5pub mod constant;
6pub mod data;
7pub mod flat;
8pub mod machine;
9pub mod program;
10pub mod syn;
11pub mod term;
12pub mod typ;
13
14pub use bumpalo;
15
16#[cfg(test)]
17mod tests {
18 use pretty_assertions::assert_eq;
19
20 use crate::binder::DeBruijn;
21 use crate::program::Version;
22
23 use super::arena::Arena;
24 use super::program::Program;
25 use super::term::Term;
26
27 #[test]
28 fn add_integer() {
29 let arena = Arena::new();
30
31 let term = Term::add_integer(&arena)
32 .apply(&arena, Term::integer_from(&arena, 1))
33 .apply(&arena, Term::integer_from(&arena, 3));
34
35 let version = Version::plutus_v3(&arena);
36
37 let program = Program::<DeBruijn>::new(&arena, version, term);
38
39 let result = program.eval(&arena);
40
41 assert_eq!(result.term.unwrap(), Term::integer_from(&arena, 4));
42 }
43
44 #[test]
45 fn fibonacci() {
46 let arena = &Arena::new();
47
48 let double_force = Term::var(arena, DeBruijn::new(arena, 1))
49 .apply(arena, Term::var(arena, DeBruijn::new(arena, 1)))
50 .lambda(arena, DeBruijn::zero(arena))
51 .delay(arena)
52 .force(arena)
53 .apply(
54 arena,
55 Term::var(arena, DeBruijn::new(arena, 3))
56 .apply(
57 arena,
58 Term::var(arena, DeBruijn::new(arena, 1))
59 .apply(arena, Term::var(arena, DeBruijn::new(arena, 1)))
60 .lambda(arena, DeBruijn::zero(arena))
61 .delay(arena)
62 .force(arena)
63 .apply(arena, Term::var(arena, DeBruijn::new(arena, 2))),
64 )
65 .apply(arena, Term::var(arena, DeBruijn::new(arena, 1)))
66 .lambda(arena, DeBruijn::zero(arena))
67 .lambda(arena, DeBruijn::zero(arena)),
68 )
69 .lambda(arena, DeBruijn::zero(arena))
70 .delay(arena)
71 .delay(arena)
72 .force(arena)
73 .force(arena);
74
75 let if_condition = Term::if_then_else(arena)
76 .force(arena)
77 .apply(arena, Term::var(arena, DeBruijn::new(arena, 3)))
78 .apply(arena, Term::var(arena, DeBruijn::new(arena, 2)))
79 .apply(arena, Term::var(arena, DeBruijn::new(arena, 1)))
80 .apply(arena, Term::unit(arena))
81 .lambda(arena, DeBruijn::zero(arena))
82 .lambda(arena, DeBruijn::zero(arena))
83 .lambda(arena, DeBruijn::zero(arena))
84 .delay(arena)
85 .force(arena);
86
87 let add = Term::add_integer(arena)
88 .apply(
89 arena,
90 Term::var(arena, DeBruijn::new(arena, 3)).apply(
91 arena,
92 Term::subtract_integer(arena)
93 .apply(arena, Term::var(arena, DeBruijn::new(arena, 2)))
94 .apply(arena, Term::integer_from(arena, 1)),
95 ),
96 )
97 .apply(
98 arena,
99 Term::var(arena, DeBruijn::new(arena, 3)).apply(
100 arena,
101 Term::subtract_integer(arena)
102 .apply(arena, Term::var(arena, DeBruijn::new(arena, 2)))
103 .apply(arena, Term::integer_from(arena, 2)),
104 ),
105 )
106 .lambda(arena, DeBruijn::zero(arena));
107
108 let term = double_force
109 .apply(
110 arena,
111 if_condition
112 .apply(
113 arena,
114 Term::less_than_equals_integer(arena)
115 .apply(arena, Term::var(arena, DeBruijn::new(arena, 1)))
116 .apply(arena, Term::integer_from(arena, 1)),
117 )
118 .apply(
119 arena,
120 Term::var(arena, DeBruijn::new(arena, 2))
121 .lambda(arena, DeBruijn::zero(arena)),
122 )
123 .apply(arena, add)
124 .lambda(arena, DeBruijn::zero(arena))
125 .lambda(arena, DeBruijn::zero(arena)),
126 )
127 .apply(arena, Term::var(arena, DeBruijn::new(arena, 1)))
128 .lambda(arena, DeBruijn::zero(arena))
129 .apply(arena, Term::integer_from(arena, 15));
130
131 let version = Version::plutus_v3(arena);
132
133 let program = Program::new(arena, version, term);
134
135 let result = program.eval(arena);
136
137 assert_eq!(result.term.unwrap(), Term::integer_from(arena, 610));
138 }
139}