1use std::{
2 hash::Hash,
3 sync::{Arc, Mutex, MutexGuard, PoisonError, RwLock, RwLockReadGuard, RwLockWriteGuard},
4};
5
6use dashmap::{DashMap, DashSet};
7
8type SharedLockResult<'a, T, R> = Result<R, PoisonError<MutexGuard<'a, T>>>;
9type SharedRwReadResult<'a, T, R> = Result<R, PoisonError<RwLockReadGuard<'a, T>>>;
10type SharedRwWriteResult<'a, T, R> = Result<R, PoisonError<RwLockWriteGuard<'a, T>>>;
11
12#[derive(Debug)]
14pub struct SharedLock<T>(Arc<Mutex<T>>);
15
16impl<T> Clone for SharedLock<T> {
17 fn clone(&self) -> Self {
18 SharedLock(Arc::clone(&self.0))
19 }
20}
21
22impl<T> SharedLock<T> {
23 pub fn new(v: T) -> Self {
25 SharedLock(Arc::new(Mutex::new(v)))
26 }
27
28 pub fn with<F, R>(&self, f: F) -> SharedLockResult<'_, T, R>
33 where
34 F: FnOnce(&mut T) -> R,
35 {
36 let mut lock = self.0.lock()?;
37 Ok(f(&mut *lock))
38 }
39
40 pub fn get(&self) -> SharedLockResult<'_, T, T>
42 where
43 T: Clone,
44 {
45 self.with(|v| v.clone())
46 }
47
48 pub fn set(&self, value: T) -> SharedLockResult<'_, T, ()> {
50 self.with(|v| *v = value)?;
51 Ok(())
52 }
53}
54
55#[derive(Debug)]
57pub struct SharedRw<T>(Arc<RwLock<T>>);
58
59impl<T> Clone for SharedRw<T> {
60 fn clone(&self) -> Self {
61 SharedRw(Arc::clone(&self.0))
62 }
63}
64
65impl<T> SharedRw<T> {
66 pub fn new(v: T) -> Self {
68 SharedRw(Arc::new(RwLock::new(v)))
69 }
70
71 pub fn read<F, R>(&self, f: F) -> SharedRwReadResult<'_, T, R>
76 where
77 F: FnOnce(&T) -> R,
78 {
79 let guard = self.0.read()?;
80 Ok(f(&*guard))
81 }
82
83 pub fn write<F, R>(&self, f: F) -> SharedRwWriteResult<'_, T, R>
88 where
89 F: FnOnce(&mut T) -> R,
90 {
91 let mut guard = self.0.write()?;
92 Ok(f(&mut *guard))
93 }
94
95 pub fn get(&self) -> SharedRwReadResult<'_, T, T>
97 where
98 T: Clone,
99 {
100 self.read(|v| v.clone())
101 }
102
103 pub fn set(&self, value: T) -> SharedRwWriteResult<'_, T, ()> {
105 self.write(|v| *v = value)?;
106 Ok(())
107 }
108}
109
110#[derive(Debug)]
112pub struct SharedMap<K: Eq + Clone + Hash, V>(Arc<DashMap<K, V>>);
113
114impl<K: Eq + Clone + Hash, V> Clone for SharedMap<K, V> {
115 fn clone(&self) -> Self {
116 SharedMap(Arc::clone(&self.0))
117 }
118}
119
120impl<K: Eq + Hash + Clone, V> SharedMap<K, V> {
121 pub fn new() -> Self {
123 SharedMap(Arc::new(DashMap::new()))
124 }
125
126 pub fn get_cloned(&self, key: &K) -> Option<V>
133 where
134 V: Clone,
135 {
136 self.0.get(key).map(|refc| refc.value().clone())
137 }
138
139 pub fn with<F, R>(&self, key: &K, f: F) -> Option<R>
144 where
145 F: FnOnce(&V) -> R,
146 {
147 let guard = self.0.get(key)?;
148 let result = f(guard.value());
149 drop(guard);
150 Some(result)
151 }
152
153 pub fn with_mut<F, R>(&self, key: &K, f: F) -> Option<R>
158 where
159 F: FnOnce(&mut V) -> R,
160 {
161 let mut guard = self.0.get_mut(key)?;
162 let result = f(guard.value_mut());
163 Some(result)
164 }
165
166 pub fn with_mut_or_insert_with<F, D, R>(&self, key: K, default: D, f: F) -> R
168 where
169 F: FnOnce(&mut V) -> R,
170 D: FnOnce() -> V,
171 {
172 let mut entry = self.0.entry(key).or_insert_with(default);
173 f(entry.value_mut())
174 }
175
176 pub fn with_mut_or_default<F, R>(&self, key: K, f: F) -> R
178 where
179 V: Default,
180 F: FnOnce(&mut V) -> R,
181 {
182 self.with_mut_or_insert_with(key, V::default, f)
183 }
184
185 pub fn for_each<F, Ret>(&self, mut f: F)
190 where
191 F: FnMut(K, &V) -> Ret,
192 {
193 for entry in self.0.iter() {
194 f(entry.key().clone(), entry.value());
195 }
196 }
197
198 pub fn for_each_mut<F, Ret>(&self, mut f: F)
203 where
204 F: FnMut(K, &mut V) -> Ret,
205 {
206 for mut entry in self.0.iter_mut() {
207 f(entry.key().clone(), entry.value_mut());
208 }
209 }
210
211 pub fn try_for_each_mut<F, E>(&self, mut f: F) -> Result<(), E>
216 where
217 F: FnMut(K, &mut V) -> Result<(), E>,
218 {
219 for mut entry in self.0.iter_mut() {
220 f(entry.key().clone(), entry.value_mut())?;
221 }
222 Ok(())
223 }
224
225 pub fn try_for_each<F, E>(&self, mut f: F) -> Result<(), E>
230 where
231 F: FnMut(K, &V) -> Result<(), E>,
232 {
233 for entry in self.0.iter() {
234 f(entry.key().clone(), entry.value())?;
235 }
236 Ok(())
237 }
238
239 pub fn insert(&self, key: K, value: V) -> Option<V> {
241 self.0.insert(key, value)
242 }
243
244 pub fn remove(&self, key: &K) -> Option<(K, V)> {
246 self.0.remove(key)
247 }
248
249 pub fn remove_if<F>(&self, key: &K, f: F) -> Option<(K, V)>
254 where
255 F: FnOnce(&K, &V) -> bool,
256 {
257 self.0.remove_if(key, f)
258 }
259
260 pub fn contains_key(&self, key: &K) -> bool {
262 self.0.contains_key(key)
263 }
264
265 pub fn retain<F>(&self, f: F)
270 where
271 F: FnMut(&K, &mut V) -> bool,
272 {
273 self.0.retain(f);
274 }
275
276 pub fn keys(&self) -> Vec<K>
278 where
279 K: Clone,
280 {
281 self.0.iter().map(|e| e.key().clone()).collect()
282 }
283
284 pub fn len(&self) -> usize {
286 self.0.len()
287 }
288
289 pub fn is_empty(&self) -> bool {
291 self.0.is_empty()
292 }
293
294 pub fn clear(&self) {
296 self.0.clear()
297 }
298}
299
300impl<K: Eq + Hash + Clone, V> Default for SharedMap<K, V> {
301 fn default() -> Self {
302 Self::new()
303 }
304}
305
306#[derive(Debug)]
308pub struct SharedSet<K: Eq + Clone + Hash>(Arc<DashSet<K>>);
309
310impl<K: Eq + Clone + Hash> Clone for SharedSet<K> {
311 fn clone(&self) -> Self {
312 SharedSet(Arc::clone(&self.0))
313 }
314}
315
316impl<K: Eq + Hash + Clone> SharedSet<K> {
317 pub fn new() -> Self {
319 SharedSet(Arc::new(DashSet::new()))
320 }
321
322 pub fn get_cloned(&self, key: &K) -> Option<K> {
329 self.0.get(key).map(|item| (*item).clone())
330 }
331
332 pub fn with<F, R>(&self, key: &K, f: F) -> Option<R>
337 where
338 F: FnOnce(&K) -> R,
339 {
340 let guard = self.0.get(key)?;
341 let result = f(guard.key());
342 drop(guard);
343 Some(result)
344 }
345
346 pub fn insert(&self, key: K) -> bool {
348 self.0.insert(key)
349 }
350
351 pub fn remove(&self, key: &K) -> Option<K> {
353 self.0.remove(key)
354 }
355
356 pub fn remove_if<F>(&self, key: &K, f: F) -> Option<K>
361 where
362 F: FnOnce(&K) -> bool,
363 {
364 self.0.remove_if(key, f)
365 }
366
367 pub fn contains(&self, key: &K) -> bool {
369 self.0.contains(key)
370 }
371
372 pub fn for_each<F, Ret>(&self, mut f: F)
377 where
378 F: FnMut(&K) -> Ret,
379 {
380 for entry in self.0.iter() {
381 f(entry.key());
382 }
383 }
384
385 pub fn try_for_each<F, E>(&self, mut f: F) -> Result<(), E>
390 where
391 F: FnMut(&K) -> Result<(), E>,
392 {
393 for entry in self.0.iter() {
394 f(entry.key())?;
395 }
396 Ok(())
397 }
398
399 pub fn retain<F>(&self, f: F)
404 where
405 F: FnMut(&K) -> bool,
406 {
407 self.0.retain(f);
408 }
409
410 pub fn items(&self) -> Vec<K> {
412 self.0.iter().map(|entry| entry.key().clone()).collect()
413 }
414
415 pub fn len(&self) -> usize {
417 self.0.len()
418 }
419
420 pub fn is_empty(&self) -> bool {
422 self.0.is_empty()
423 }
424
425 pub fn clear(&self) {
427 self.0.clear()
428 }
429}
430
431impl<K: Eq + Hash + Clone> Default for SharedSet<K> {
432 fn default() -> Self {
433 Self::new()
434 }
435}
436
437#[cfg(test)]
438mod tests {
439 use super::*;
440
441 #[test]
442 fn shared_basic_usage() {
443 let v = SharedLock::new(10);
444
445 let _ = v.with(|x| *x += 5);
446 assert_eq!(v.get().unwrap(), 15);
447
448 let _ = v.set(42);
449 assert_eq!(v.get().unwrap(), 42);
450 }
451
452 #[test]
453 fn shared_rw_usage() {
454 let v = SharedRw::new(100);
455
456 let a = v.read(|x| *x).unwrap();
457 let b = v.read(|x| *x).unwrap();
458 assert_eq!(a, b);
459
460 let _ = v.write(|x| *x += 1);
461 assert_eq!(v.get().unwrap(), 101);
462 }
463
464 #[test]
465 fn shared_map_usage() {
466 let map = SharedMap::new();
467
468 map.insert("a", 1);
469 map.insert("b", 2);
470
471 let val = map.with(&"a", |v| *v).unwrap();
472 assert_eq!(val, 1);
473
474 map.with_mut(&"a", |v| *v += 10);
475 assert_eq!(map.with(&"a", |v| *v).unwrap(), 11);
476
477 map.with_mut_or_default("c", |v| *v += 3);
478 assert_eq!(map.get_cloned(&"c"), Some(3));
479
480 let mut sum = 0;
481 map.for_each(|_, v| sum += v);
482 assert_eq!(sum, 16);
483
484 map.remove(&"a");
485 assert!(!map.contains_key(&"a"));
486 }
487
488 #[test]
489 fn shared_set_usage() {
490 let set = SharedSet::new();
491
492 assert!(set.insert("a"));
493 assert!(!set.insert("a"));
494 assert!(set.contains(&"a"));
495 assert_eq!(set.get_cloned(&"a"), Some("a"));
496 assert_eq!(set.with(&"a", |item| item.len()), Some(1));
497
498 assert_eq!(set.remove_if(&"a", |item| item.starts_with("z")), None);
499 assert!(set.contains(&"a"));
500 assert_eq!(set.remove_if(&"a", |item| item.starts_with("a")), Some("a"));
501 assert!(!set.contains(&"a"));
502
503 set.insert("a");
504 set.insert("b");
505 let mut items = set.items();
506 items.sort();
507 assert_eq!(items, vec!["a", "b"]);
508
509 let mut iterated = Vec::new();
510 set.for_each(|item| iterated.push(item.to_string()));
511 iterated.sort();
512 assert_eq!(iterated, vec!["a".to_string(), "b".to_string()]);
513
514 let result: Result<(), ()> =
515 set.try_for_each(|item| if *item == "b" { Err(()) } else { Ok(()) });
516 assert!(result.is_err());
517
518 set.retain(|item| *item != "a");
519 assert_eq!(set.items(), vec!["b"]);
520
521 set.clear();
522 assert!(set.is_empty());
523 }
524}