use std::{ffi::c_void, marker::PhantomData};
use crate::Userdata;
#[derive(Debug)]
pub(crate) struct CallbackMut<T: 'static>(PhantomData<T>);
type CallbackMutUserdata<T> = Userdata<Box<dyn FnMut(T) + 'static>>;
impl<T> CallbackMut<T> {
pub(crate) fn prepare<F>(f: F) -> *mut c_void
where
F: FnMut(T) + 'static,
{
CallbackMutUserdata::<T>::prepare(Box::new(f))
}
pub(crate) unsafe fn execute(data: *mut c_void, payload: T) {
let f = unsafe { CallbackMutUserdata::<T>::peek_at(data) };
f(payload);
}
pub(crate) unsafe fn delete(data: *mut c_void) {
let f = unsafe { CallbackMutUserdata::<T>::consume(data) };
drop(f);
}
}