1use id_arena::Arena;
2
3use crate::{Alias, Atom, Generic, Pair, Type, TypeId, Union};
4
5#[derive(Debug, Clone, Copy)]
6pub struct BuiltinTypes {
7 pub unresolved: TypeId,
8 pub atom: TypeId,
9 pub bytes: TypeId,
10 pub bytes32: TypeId,
11 pub string: TypeId,
12 pub public_key: TypeId,
13 pub signature: TypeId,
14 pub k1_public_key: TypeId,
15 pub k1_signature: TypeId,
16 pub r1_public_key: TypeId,
17 pub r1_signature: TypeId,
18 pub int: TypeId,
19 pub bool_true: TypeId,
20 pub bool_false: TypeId,
21 pub bool: TypeId,
22 pub nil: TypeId,
23 pub never: TypeId,
24 pub recursive_any: TypeId,
25 pub recursive_any_pair: TypeId,
26 pub permissive_any: TypeId,
27 pub list: TypeId,
28 pub list_generic: TypeId,
29 pub alternating_list: TypeId,
30 pub alternating_list_generic_a: TypeId,
31 pub alternating_list_generic_b: TypeId,
32}
33
34impl BuiltinTypes {
35 pub fn new(arena: &mut Arena<Type>) -> Self {
36 let unresolved = arena.alloc(Type::Unresolved);
37 let atom = arena.alloc(Type::Atom(Atom::ANY));
38 let bytes = arena.alloc(Type::Atom(Atom::BYTES));
39 let bytes32 = arena.alloc(Type::Atom(Atom::BYTES_32));
40 let string = arena.alloc(Type::Atom(Atom::STRING));
41 let public_key = arena.alloc(Type::Atom(Atom::PUBLIC_KEY));
42 let signature = arena.alloc(Type::Atom(Atom::SIGNATURE));
43 let k1_public_key = arena.alloc(Type::Atom(Atom::K1_PUBLIC_KEY));
44 let k1_signature = arena.alloc(Type::Atom(Atom::K1_SIGNATURE));
45 let r1_public_key = arena.alloc(Type::Atom(Atom::R1_PUBLIC_KEY));
46 let r1_signature = arena.alloc(Type::Atom(Atom::R1_SIGNATURE));
47 let int = arena.alloc(Type::Atom(Atom::INT));
48 let bool_true = arena.alloc(Type::Atom(Atom::TRUE));
49 let bool_false = arena.alloc(Type::Atom(Atom::FALSE));
50 let bool = arena.alloc(Type::Union(Union::new(vec![bool_true, bool_false])));
51 let never = arena.alloc(Type::Never);
52 let nil = arena.alloc(Type::Atom(Atom::NIL));
53
54 let recursive_any = arena.alloc(Type::Unresolved);
55 let recursive_any_pair = arena.alloc(Type::Pair(Pair::new(recursive_any, recursive_any)));
56 *arena.get_mut(recursive_any).unwrap() =
57 Type::Union(Union::new(vec![atom, recursive_any_pair]));
58 let permissive_any = arena.alloc(Type::Any);
59
60 let list = arena.alloc(Type::Unresolved);
61 let list_generic = arena.alloc(Type::Generic(Generic { name: None }));
62 let list_pair = arena.alloc(Type::Pair(Pair::new(list_generic, list)));
63 let list_union = arena.alloc(Type::Union(Union::new(vec![nil, list_pair])));
64 *arena.get_mut(list).unwrap() = Type::Alias(Alias {
65 name: None,
66 inner: list_union,
67 generics: vec![list_generic],
68 });
69
70 let alternating_list = arena.alloc(Type::Unresolved);
71 let alternating_list_generic_a = arena.alloc(Type::Generic(Generic { name: None }));
72 let alternating_list_generic_b = arena.alloc(Type::Generic(Generic { name: None }));
73 let alternating_list_pair = arena.alloc(Type::Pair(Pair::new(
74 alternating_list_generic_b,
75 alternating_list,
76 )));
77 let alternating_list_pair = arena.alloc(Type::Pair(Pair::new(
78 alternating_list_generic_a,
79 alternating_list_pair,
80 )));
81 let alternating_list_union =
82 arena.alloc(Type::Union(Union::new(vec![nil, alternating_list_pair])));
83 *arena.get_mut(alternating_list).unwrap() = Type::Alias(Alias {
84 name: None,
85 inner: alternating_list_union,
86 generics: vec![alternating_list_generic_a, alternating_list_generic_b],
87 });
88
89 Self {
90 unresolved,
91 atom,
92 bytes,
93 bytes32,
94 string,
95 public_key,
96 signature,
97 k1_public_key,
98 k1_signature,
99 r1_public_key,
100 r1_signature,
101 int,
102 bool_true,
103 bool_false,
104 bool,
105 nil,
106 never,
107 recursive_any,
108 recursive_any_pair,
109 permissive_any,
110 list,
111 list_generic,
112 alternating_list,
113 alternating_list_generic_a,
114 alternating_list_generic_b,
115 }
116 }
117}