deno_maybe_sync/
lib.rs

1// Copyright 2018-2025 the Deno authors. MIT license.
2
3pub use inner::*;
4
5#[cfg(feature = "sync")]
6mod inner {
7  #![allow(clippy::disallowed_types)]
8
9  pub use core::marker::Send as MaybeSend;
10  pub use core::marker::Sync as MaybeSync;
11  pub use std::sync::Arc as MaybeArc;
12  pub use std::sync::OnceLock as MaybeOnceLock;
13
14  pub use dashmap::DashMap as MaybeDashMap;
15  pub use dashmap::DashSet as MaybeDashSet;
16}
17
18#[cfg(not(feature = "sync"))]
19mod inner {
20  pub use std::cell::OnceCell as MaybeOnceLock;
21  use std::cell::Ref;
22  use std::cell::RefCell;
23  use std::collections::HashMap;
24  use std::hash::BuildHasher;
25  use std::hash::Hash;
26  use std::hash::RandomState;
27  pub use std::rc::Rc as MaybeArc;
28
29  pub trait MaybeSync {}
30  impl<T> MaybeSync for T where T: ?Sized {}
31  pub trait MaybeSend {}
32  impl<T> MaybeSend for T where T: ?Sized {}
33
34  // Wrapper struct that exposes a subset of `DashMap` API.
35  #[derive(Debug)]
36  pub struct MaybeDashMap<K, V, S = RandomState>(RefCell<HashMap<K, V, S>>);
37
38  impl<K, V, S> Default for MaybeDashMap<K, V, S>
39  where
40    K: Eq + Hash,
41    S: Default + BuildHasher + Clone,
42  {
43    fn default() -> Self {
44      Self(RefCell::new(Default::default()))
45    }
46  }
47
48  impl<K: Eq + Hash, V, S: BuildHasher> MaybeDashMap<K, V, S> {
49    pub fn get<'a, Q: Eq + Hash + ?Sized>(
50      &'a self,
51      key: &Q,
52    ) -> Option<Ref<'a, V>>
53    where
54      K: std::borrow::Borrow<Q>,
55    {
56      Ref::filter_map(self.0.borrow(), |map| map.get(key)).ok()
57    }
58
59    pub fn insert(&self, key: K, value: V) -> Option<V> {
60      let mut inner = self.0.borrow_mut();
61      inner.insert(key, value)
62    }
63
64    pub fn clear(&self) {
65      self.0.borrow_mut().clear();
66    }
67
68    pub fn remove(&self, key: &K) -> Option<(K, V)> {
69      self.0.borrow_mut().remove_entry(key)
70    }
71
72    #[allow(clippy::len_without_is_empty)]
73    pub fn len(&self) -> usize {
74      self.0.borrow().len()
75    }
76  }
77
78  // Wrapper struct that exposes a subset of `DashMap` API.
79  #[derive(Debug)]
80  pub struct MaybeDashSet<V, S = RandomState>(
81    RefCell<std::collections::HashSet<V, S>>,
82  );
83
84  impl<V, S> Default for MaybeDashSet<V, S>
85  where
86    V: Eq + Hash,
87    S: Default + BuildHasher + Clone,
88  {
89    fn default() -> Self {
90      Self(RefCell::new(Default::default()))
91    }
92  }
93
94  impl<V: Eq + Hash, S: BuildHasher> MaybeDashSet<V, S> {
95    pub fn insert(&self, value: V) -> bool {
96      let mut inner = self.0.borrow_mut();
97      inner.insert(value)
98    }
99  }
100}
101
102#[allow(clippy::disallowed_types)]
103#[inline]
104pub fn new_rc<T>(value: T) -> MaybeArc<T> {
105  MaybeArc::new(value)
106}
107
108#[allow(clippy::disallowed_types)]
109#[inline]
110pub fn new_arc<T>(value: T) -> std::sync::Arc<T> {
111  std::sync::Arc::new(value)
112}