diode_base/defer.rs
1pub fn defer<F>(f: F) -> impl Drop
2where
3 F: FnOnce(),
4{
5 struct Defer<F: FnOnce()>(Option<F>);
6 impl<F: FnOnce()> Drop for Defer<F> {
7 fn drop(&mut self) {
8 self.0.take().unwrap()();
9 }
10 }
11 Defer(Some(f))
12}
13
14#[macro_export]
15macro_rules! defer {
16 ($e:expr) => {
17 let _defer = $crate::defer(|| $e);
18 };
19 ($($data: tt)*) => {
20 $crate::defer!({ $($data)* });
21 };
22}