use lasso::{Spur, ThreadedRodeo};
use std::sync::LazyLock;
pub static INTERNER: LazyLock<ThreadedRodeo> = LazyLock::new(ThreadedRodeo::default);
const MAX_RETRIES: usize = 1024;
#[inline(always)]
pub fn intern(s: &str) -> Spur {
for _ in 0..MAX_RETRIES {
match INTERNER.try_get_or_intern(s) {
Ok(key) => return key,
Err(_) => std::thread::yield_now(),
}
}
panic!("string interner failed after {MAX_RETRIES} attempts for {s:?}");
}
#[inline(always)]
pub fn resolve(key: Spur) -> &'static str {
INTERNER.resolve(&key)
}