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}
18
19impl<'a> Type<'a> {
20 pub fn integer(arena: &'a Arena) -> &'a Type<'a> {
21 arena.alloc(Type::Integer)
22 }
23
24 pub fn bool(arena: &'a Arena) -> &'a Type<'a> {
25 arena.alloc(Type::Bool)
26 }
27
28 pub fn string(arena: &'a Arena) -> &'a Type<'a> {
29 arena.alloc(Type::String)
30 }
31
32 pub fn byte_string(arena: &'a Arena) -> &'a Type<'a> {
33 arena.alloc(Type::ByteString)
34 }
35
36 pub fn unit(arena: &'a Arena) -> &'a Type<'a> {
37 arena.alloc(Type::Unit)
38 }
39
40 pub fn data(arena: &'a Arena) -> &'a Type<'a> {
41 arena.alloc(Type::Data)
42 }
43
44 pub fn list(arena: &'a Arena, inner: &'a Type<'a>) -> &'a Type<'a> {
45 arena.alloc(Type::List(inner))
46 }
47
48 pub fn array(arena: &'a Arena, inner: &'a Type<'a>) -> &'a Type<'a> {
49 arena.alloc(Type::Array(inner))
50 }
51
52 pub fn pair(arena: &'a Arena, fst: &'a Type<'a>, snd: &'a Type<'a>) -> &'a Type<'a> {
53 arena.alloc(Type::Pair(fst, snd))
54 }
55
56 pub fn g1(arena: &'a Arena) -> &'a Type<'a> {
57 arena.alloc(Type::Bls12_381G1Element)
58 }
59
60 pub fn g2(arena: &'a Arena) -> &'a Type<'a> {
61 arena.alloc(Type::Bls12_381G2Element)
62 }
63
64 pub fn ml_result(arena: &'a Arena) -> &'a Type<'a> {
65 arena.alloc(Type::Bls12_381MlResult)
66 }
67}