use std::sync::{Mutex, OnceLock, PoisonError};
use rustc_hash::FxHashSet;
static INTERNER: OnceLock<Mutex<FxHashSet<&'static str>>> = OnceLock::new();
pub(crate) fn intern(s: &str) -> &'static str {
let interner = INTERNER.get_or_init(|| Mutex::new(FxHashSet::default()));
let mut set = interner.lock().unwrap_or_else(PoisonError::into_inner);
if let Some(&existing) = set.get(s) {
return existing;
}
let leaked: &'static str = Box::leak(s.to_owned().into_boxed_str());
let _ = set.insert(leaked);
leaked
}
#[cfg(test)]
mod tests {
use super::intern;
#[test]
fn interning_returns_static_reference() {
let s = intern("hello");
assert_eq!(s, "hello");
}
#[test]
fn interning_deduplicates_identical_strings() {
let a = intern("dedupe_target");
let b = intern("dedupe_target");
assert!(std::ptr::eq(a.as_ptr(), b.as_ptr()));
}
#[test]
fn interning_distinct_strings_returns_distinct_pointers() {
let a = intern("alpha_unique");
let b = intern("beta_unique");
assert!(!std::ptr::eq(a.as_ptr(), b.as_ptr()));
}
}