struct OnDrop(Option); impl Drop for OnDrop { fn drop(&mut self) { if let Some(close) = self.0.take() { close(); } } } fn demo(open: impl FnOnce(&str, i32, i32, i32) -> bool, close: impl FnOnce()) { if !open("demo", 640, 480, 0) { return; } let _cleanup = OnDrop(Some(close)); // Window work goes here; normal scope exits run the guard. } fn main() { let closed = std::cell::Cell::new(0); demo(|title,w,h,flags| { assert_eq!((title,w,h,flags),("demo",640,480,0)); true }, || closed.set(closed.get()+1)); assert_eq!(closed.get(),1); demo(|_,_,_,_|false, || closed.set(closed.get()+1)); assert_eq!(closed.get(),1); }