// check-pass use std::sync::Mutex; use std::cell::RefCell; use std::rc::Rc; use std::ops::*; //eefriedman example struct S<'a, T:FnMut() + 'static + ?Sized>(&'a mut T); impl<'a, T:?Sized + FnMut() + 'static> DerefMut for S<'a, T> { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 } } impl<'a, T:?Sized + FnMut() + 'static> Deref for S<'a, T> { type Target = dyn FnMut() + 'a; fn deref(&self) -> &Self::Target { &self.0 } } //Ossipal example struct FunctionIcon { get_icon: Mutex u32>>, } impl FunctionIcon { fn get_icon(&self) -> impl '_ + std::ops::DerefMut u32>> { self.get_icon.lock().unwrap() } fn load_icon(&self) { let mut get_icon = self.get_icon(); let _rgba_icon = (*get_icon)(); } } //shepmaster example struct Foo; impl Deref for Foo { type Target = dyn FnMut() + 'static; fn deref(&self) -> &Self::Target { unimplemented!() } } impl DerefMut for Foo { fn deref_mut(&mut self) -> &mut Self::Target { unimplemented!() } } fn main() { //eefriedman example let mut f = ||{}; let mut s = S(&mut f); s(); //Diggsey/Mark-Simulacrum example let a: Rc> = Rc::new(RefCell::new(||{})); a.borrow_mut()(); //shepmaster example let mut t = Foo; t(); }