use crate::Hook;
mod private {
pub trait Sealed {}
impl Sealed for crate::Hooks<'_, '_> {}
}
pub trait UseOnDrop: private::Sealed {
fn use_on_drop<F>(&mut self, f: F)
where
F: FnMut() + 'static;
}
#[derive(Default)]
struct UseOnDropImpl {
callback: Option<Box<dyn FnMut()>>,
}
impl Hook for UseOnDropImpl {
fn on_drop(&mut self) {
if let Some(mut callback) = self.callback.take() {
callback();
}
}
}
impl UseOnDrop for crate::Hooks<'_, '_> {
fn use_on_drop<F>(&mut self, f: F)
where
F: FnMut() + 'static,
{
let hook = self.use_hook(UseOnDropImpl::default);
hook.callback.replace(Box::new(f));
}
}