1use std::sync::Arc;
2use std::sync::Mutex;
3
4use crate::access::{Access, ReflectDirect};
5use crate::climber::{ClimbError, Climber};
6use crate::node_tree::{NodeInfo, NodeTree};
7use crate::reflector::Reflector;
8
9impl<T> ReflectDirect for Mutex<T>
10where
11 T: Access,
12{
13 fn immut_reflector(&self, reflector: &Arc<Reflector>) -> NodeTree {
14 match self.try_lock() {
15 Ok(locked) => Reflector::reflect(reflector, &*locked),
16 Err(_) => NodeInfo::Locked.into_node(),
17 }
18 }
19
20 fn immut_climber<'a>(&self, climber: &mut Climber<'a>) -> Result<Option<NodeTree>, ClimbError> {
21 climber.mutex_handling(self).map(Some)
22 }
23
24 fn mut_climber<'a>(
25 &mut self,
26 climber: &mut Climber<'a>,
27 ) -> Result<Option<NodeTree>, ClimbError> {
28 climber.mutex_handling(self).map(Some)
29 }
30}
31
32use interact_derive::derive_interact_opaque;
33
34derive_interact_opaque! {
35 struct Mutex<T>;
36}