Skip to main content

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}