comet/core/
shared.rs

1use crate::prelude::ToVirtualNode;
2use crate::prelude::VirtualNode;
3use async_trait::async_trait;
4use std::ops::Deref;
5use std::sync::Arc;
6use tokio::sync::RwLock;
7
8#[derive(Default)]
9pub struct Shared<T>(pub Arc<RwLock<T>>);
10
11impl<T> Clone for Shared<T> {
12    fn clone(&self) -> Self {
13        Self(Arc::clone(&self.0))
14    }
15}
16
17impl<T> From<T> for Shared<T> {
18    fn from(t: T) -> Self {
19        Self(Arc::new(RwLock::new(t)))
20    }
21}
22
23impl<T> Deref for Shared<T> {
24    type Target = RwLock<T>;
25
26    fn deref(&self) -> &Self::Target {
27        &self.0
28    }
29}
30
31#[async_trait(?Send)]
32impl<T> ToVirtualNode for Shared<T>
33where
34    T: ToVirtualNode + Clone,
35{
36    async fn to_virtual_node(self) -> VirtualNode {
37        let new_self = self.0.read().await.clone();
38        new_self.to_virtual_node().await
39    }
40}
41
42/* #[async_trait(?Send)]
43impl<T> ToVirtualNode for Shared<T>
44where
45    T: ToVirtualNode + Clone,
46{
47    async fn to_virtual_node(self) -> VirtualNode {
48        let new_self = self.0.read().await.clone();
49        new_self.to_virtual_node().await
50    }
51} */