use crate::resource::{Resource, ResourceArc};
use crate::types::{Env, LocalPid, Term};
pub use enif_ffi::{
Event, SELECT_ERROR_CANCELLED, SELECT_FAILED, SELECT_INVALID_EVENT, SELECT_NOTSUP,
SELECT_READ_CANCELLED, SELECT_STOP_CALLED, SELECT_STOP_SCHEDULED, SELECT_WRITE_CANCELLED,
SelectFlags,
};
pub fn select<'id, T: Resource>(
env: impl Env<'id>,
event: enif_ffi::Event,
flags: enif_ffi::SelectFlags,
obj: &ResourceArc<T>,
pid: &LocalPid,
ref_term: impl Term<'id>,
) -> i32 {
unsafe {
enif_ffi::select(
env.raw_env(),
event,
flags,
obj.raw_ptr(),
&pid.pid,
ref_term.raw_term(),
)
}
}
pub fn select_x<'id, 'm, T: Resource, M: Env<'m>>(
env: impl Env<'id>,
event: enif_ffi::Event,
flags: enif_ffi::SelectFlags,
obj: &ResourceArc<T>,
pid: &LocalPid,
msg: impl Term<'m>,
msg_env: Option<M>,
) -> i32 {
let msg_env_ptr = msg_env.map(|e| e.raw_env()).unwrap_or(std::ptr::null_mut());
unsafe {
enif_ffi::select_x(
env.raw_env(),
event,
flags,
obj.raw_ptr(),
&pid.pid,
msg.raw_term(),
msg_env_ptr,
)
}
}