1use crate::*;
2
3#[derive(Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
5pub struct Id(pub usize);
6
7#[derive(Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
12pub struct AppliedId {
13 pub id: Id,
14
15 pub m: SlotMap,
19}
20
21#[derive(Clone, PartialEq, Eq)]
25pub struct RecExpr<L: Language> {
26 pub node: L,
27 pub children: Vec<RecExpr<L>>,
28}
29
30impl AppliedId {
31 pub fn new(id: Id, m: SlotMap) -> Self {
32 let s = AppliedId { id, m };
33 if CHECKS {
34 s.check();
35 }
36 s
37 }
38
39 pub(crate) fn check(&self) {
40 assert!(self.m.is_bijection());
41 }
42
43 #[track_caller]
44 pub fn apply_slotmap(&self, m: &SlotMap) -> AppliedId {
45 if CHECKS {
46 assert!(
47 m.keys().is_superset(&self.slots()),
48 "AppliedId::apply_slotmap: The SlotMap doesn't map all free slots!"
49 );
50 }
51 self.apply_slotmap_partial(m)
52 }
53
54 pub fn apply_slotmap_partial(&self, m: &SlotMap) -> AppliedId {
55 AppliedId::new(self.id, self.m.compose_partial(m))
56 }
57
58 pub fn apply_slotmap_fresh(&self, m: &SlotMap) -> AppliedId {
59 AppliedId::new(self.id, self.m.compose_fresh(m))
60 }
61
62 pub fn slots(&self) -> SmallHashSet<Slot> {
63 self.m.values()
64 }
65
66 pub fn slots_mut(&mut self) -> Vec<&mut Slot> {
68 self.m.values_mut().collect()
69 }
70
71 pub fn null() -> Self {
72 AppliedId {
73 id: Id(0),
74 m: SlotMap::new(),
75 }
76 }
77}