diff options
| author | tslil <tslil@posteo.de> | 2026-05-01 10:56:10 +0100 |
|---|---|---|
| committer | tslil <tslil@posteo.de> | 2026-05-01 11:12:09 +0100 |
| commit | 8839959fd05a04f2d37461ab842d23107b104d20 (patch) | |
| tree | 99bd59416a186cbbc91a5ae01766246d4a8a37bb /src/checker_state.rs | |
| parent | 0f7efe7518b925d9688dad4c6f6e87f84015e2c1 (diff) | |
add monotic counters, fix element binding case in app->for
Diffstat (limited to 'src/checker_state.rs')
| -rw-r--r-- | src/checker_state.rs | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/src/checker_state.rs b/src/checker_state.rs index a0fe6b1..3d933f2 100644 --- a/src/checker_state.rs +++ b/src/checker_state.rs @@ -1,9 +1,12 @@ use crate::ast::*; -use tracing::instrument; use derive_more::Display; +use tracing::instrument; + use std::collections::HashMap; use std::fmt; +use std::sync::Arc; +use std::sync::atomic::{AtomicUsize, Ordering}; #[derive(Display)] pub enum CheckerError { @@ -115,9 +118,8 @@ pub struct CheckerState { record_fields: HashMap<String, Field<Set>>, variant_fields: HashMap<String, Field<Set>>, signature_fields: HashMap<String, Field<Signature>>, - // TODO: do we need to make these strictly monotonic somewhere somehow? - binder_element: usize, - unique_name: usize, + binder_element: Arc<AtomicUsize>, + unique_name: Arc<AtomicUsize>, } impl fmt::Display for CheckerState { @@ -427,11 +429,16 @@ impl CheckerState { // ----------------------------------------------------------------------------- // Bindings + +fn _reserved_name(n: usize) -> String { + format!("#{}", n) +} + impl CheckerState { fn _make_canonical_element(&mut self, name: String, set: Set) -> Result<String, CheckerError> { - let canonical = format!("_#{}", self.binder_element); + let n = self.binder_element.fetch_add(1, Ordering::Relaxed); + let canonical = _reserved_name(n); self.add_element(name, Element::Var(canonical.clone()).into(), set)?; - self.binder_element += 1; Ok(canonical) } @@ -456,7 +463,7 @@ impl CheckerState { #[instrument(skip(self))] pub fn make_unique_name(&mut self) -> String { - self.unique_name += 1; - format!("_#{}", self.unique_name) + let n = self.unique_name.fetch_add(1, Ordering::Relaxed); + _reserved_name(n) } } |
