1use crate::arena::Arena;
2
3#[derive(Debug, PartialEq)]
4pub enum Type<'a> {
5 Bool,
6 Integer,
7 String,
8 ByteString,
9 Unit,
10 List(&'a Type<'a>),
11 Array(&'a Type<'a>),
12 Pair(&'a Type<'a>, &'a Type<'a>),
13 Data,
14 Bls12_381G1Element,
15 Bls12_381G2Element,
16 Bls12_381MlResult,
17 Value,
18}
19
20impl<'a> Type<'a> {
21 pub fn integer(arena: &'a Arena) -> &'a Type<'a> {
22 arena.alloc(Type::Integer)
23 }
24
25 pub fn bool(arena: &'a Arena) -> &'a Type<'a> {
26 arena.alloc(Type::Bool)
27 }
28
29 pub fn string(arena: &'a Arena) -> &'a Type<'a> {
30 arena.alloc(Type::String)
31 }
32
33 pub fn byte_string(arena: &'a Arena) -> &'a Type<'a> {
34 arena.alloc(Type::ByteString)
35 }
36
37 pub fn unit(arena: &'a Arena) -> &'a Type<'a> {
38 arena.alloc(Type::Unit)
39 }
40
41 pub fn data(arena: &'a Arena) -> &'a Type<'a> {
42 arena.alloc(Type::Data)
43 }
44
45 pub fn list(arena: &'a Arena, inner: &'a Type<'a>) -> &'a Type<'a> {
46 arena.alloc(Type::List(inner))
47 }
48
49 pub fn array(arena: &'a Arena, inner: &'a Type<'a>) -> &'a Type<'a> {
50 arena.alloc(Type::Array(inner))
51 }
52
53 pub fn pair(arena: &'a Arena, fst: &'a Type<'a>, snd: &'a Type<'a>) -> &'a Type<'a> {
54 arena.alloc(Type::Pair(fst, snd))
55 }
56
57 pub fn g1(arena: &'a Arena) -> &'a Type<'a> {
58 arena.alloc(Type::Bls12_381G1Element)
59 }
60
61 pub fn g2(arena: &'a Arena) -> &'a Type<'a> {
62 arena.alloc(Type::Bls12_381G2Element)
63 }
64
65 pub fn ml_result(arena: &'a Arena) -> &'a Type<'a> {
66 arena.alloc(Type::Bls12_381MlResult)
67 }
68
69 pub fn value(arena: &'a Arena) -> &'a Type<'a> {
70 arena.alloc(Type::Value)
71 }
72}