diff --git a/src/utility/mutex.rs b/src/utility/mutex.rs index c0988ad..e082cb2 100644 --- a/src/utility/mutex.rs +++ b/src/utility/mutex.rs @@ -15,7 +15,29 @@ where fn scope(&self, f: ScopeFn) -> ScopeFnOutput { let mut lock = self.lock().unwrap(); let inner = lock.deref_mut(); - + f(inner) } +} + +pub trait MutexScopeAsync { + async fn async_scope<'a, F, FnFut, FnOut>(&'a self, f: F) -> FnOut + where + FnFut: Future, + F: FnOnce(&'a mut T) -> FnFut, + T: 'a; +} + +impl MutexScopeAsync for Mutex { + async fn async_scope<'a, F, FnFut, FnOut>(&'a self, f: F) -> FnOut + where + FnFut: Future, + F: FnOnce(&'a mut T) -> FnFut, + T: 'a, + { + let mut guard = self.lock().unwrap(); + + let ptr: &'a mut T = unsafe { &mut *(guard.deref_mut() as *mut _) }; + f(ptr).await + } } \ No newline at end of file