dada_ir_sym/ir/
indices.rs1use salsa::Update;
2use serde::Serialize;
3
4use crate::ir::types::SymGenericKind;
5
6#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Update, Debug, Serialize)]
8pub struct InferVarIndex(usize);
9
10pub 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
47pub trait FromInferVar<'db> {
49 fn infer(db: &'db dyn crate::Db, kind: SymGenericKind, var: InferVarIndex) -> Self;
50}