uplc_turbo/
lib.rs

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}