1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
use crate::prelude::*;
#[must_use = "This deferred function runs immediately. Assign it to a guard to run it at the end of the block: `let _guard = defer(…);`"]
pub struct Deferred<F>(ManuallyDrop<F>)
where
F: FnOnce();
pub fn defer<F>(func: F) -> Deferred<F>
where
F: FnOnce(),
{
Deferred(ManuallyDrop::new(func))
}
impl<F> Drop for Deferred<F>
where
F: FnOnce(),
{
fn drop(&mut self) {
let func = unsafe { ManuallyDrop::take(&mut self.0) };
func();
}
}