Skip to main content

deno_maybe_sync/
lib.rs

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