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