Skip to main content

dada_ir_sym/ir/
indices.rs

1use salsa::Update;
2use serde::Serialize;
3
4use crate::ir::types::SymGenericKind;
5
6/// Identifies a particular inference variable during type checking.
7#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Update, Debug, Serialize)]
8pub struct InferVarIndex(usize);
9
10/// Create an instance of `Self` from an inference variable
11pub trait FromInfer<'db> {
12    fn infer(db: &'db dyn crate::Db, var: InferVarIndex) -> Self;
13}
14
15impl InferVarIndex {
16    pub fn as_usize(self) -> usize {
17        self.0
18    }
19
20    pub fn range(max: InferVarIndex) -> impl Iterator<Item = InferVarIndex> {
21        (0..max.0).map(InferVarIndex)
22    }
23}
24
25impl From<usize> for InferVarIndex {
26    fn from(value: usize) -> Self {
27        InferVarIndex(value)
28    }
29}
30
31impl std::ops::Add<usize> for InferVarIndex {
32    type Output = InferVarIndex;
33
34    fn add(self, value: usize) -> Self {
35        Self::from(self.as_usize().checked_add(value).unwrap())
36    }
37}
38
39impl std::ops::Sub<InferVarIndex> for InferVarIndex {
40    type Output = usize;
41
42    fn sub(self, value: InferVarIndex) -> usize {
43        self.as_usize().checked_sub(value.as_usize()).unwrap()
44    }
45}
46
47/// Many of our types can be created from a variable
48pub trait FromInferVar<'db> {
49    fn infer(db: &'db dyn crate::Db, kind: SymGenericKind, var: InferVarIndex) -> Self;
50}