// Copyright 2018-2025 the Deno authors. MIT license. pub use inner::*; #[cfg(feature = "sync")] mod inner { #![allow(clippy::disallowed_types)] pub use core::marker::Send as MaybeSend; pub use core::marker::Sync as MaybeSync; pub use std::sync::Arc as MaybeArc; pub use std::sync::OnceLock as MaybeOnceLock; pub use dashmap::DashMap as MaybeDashMap; pub use dashmap::DashSet as MaybeDashSet; } #[cfg(not(feature = "sync"))] mod inner { pub use std::cell::OnceCell as MaybeOnceLock; use std::cell::Ref; use std::cell::RefCell; use std::collections::HashMap; use std::hash::BuildHasher; use std::hash::Hash; use std::hash::RandomState; pub use std::rc::Rc as MaybeArc; pub trait MaybeSync {} impl MaybeSync for T where T: ?Sized {} pub trait MaybeSend {} impl MaybeSend for T where T: ?Sized {} // Wrapper struct that exposes a subset of `DashMap` API. #[derive(Debug)] pub struct MaybeDashMap(RefCell>); impl Default for MaybeDashMap where K: Eq + Hash, S: Default + BuildHasher + Clone, { fn default() -> Self { Self(RefCell::new(Default::default())) } } impl MaybeDashMap { pub fn get<'a, Q: Eq + Hash + ?Sized>( &'a self, key: &Q, ) -> Option> where K: std::borrow::Borrow, { Ref::filter_map(self.0.borrow(), |map| map.get(key)).ok() } pub fn insert(&self, key: K, value: V) -> Option { let mut inner = self.0.borrow_mut(); inner.insert(key, value) } pub fn clear(&self) { self.0.borrow_mut().clear(); } pub fn remove(&self, key: &K) -> Option<(K, V)> { self.0.borrow_mut().remove_entry(key) } #[allow(clippy::len_without_is_empty)] pub fn len(&self) -> usize { self.0.borrow().len() } } // Wrapper struct that exposes a subset of `DashMap` API. #[derive(Debug)] pub struct MaybeDashSet( RefCell>, ); impl Default for MaybeDashSet where V: Eq + Hash, S: Default + BuildHasher + Clone, { fn default() -> Self { Self(RefCell::new(Default::default())) } } impl MaybeDashSet { pub fn insert(&self, value: V) -> bool { let mut inner = self.0.borrow_mut(); inner.insert(value) } } } #[allow(clippy::disallowed_types)] #[inline] pub fn new_rc(value: T) -> MaybeArc { MaybeArc::new(value) }