rue_types/
builtins.rs

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}