use crate::tasks::{CbArgs, IOEvent};
use crossfire::{MTx, Tx, flavor::Flavor};
use io_buffer::Buffer;
use rustix::io::Errno;
pub trait Worker<C: CbArgs>: Send + 'static {
fn done(&self, event: Box<IOEvent<C>>);
}
impl<C, F> Worker<C> for MTx<F>
where
F: Flavor<Item = Box<IOEvent<C>>>,
C: CbArgs,
{
fn done(&self, item: Box<IOEvent<C>>) {
let _ = self.send(item);
}
}
impl<C, F> Worker<C> for Tx<F>
where
F: Flavor<Item = Box<IOEvent<C>>>,
C: CbArgs,
{
fn done(&self, item: Box<IOEvent<C>>) {
let _ = self.send(item);
}
}
pub struct InlineClosure<C: CbArgs>(pub Box<dyn Fn(C, i64, Result<Option<Buffer>, Errno>) + Send>);
impl<C: CbArgs> Worker<C> for InlineClosure<C> {
fn done(&self, event: Box<IOEvent<C>>) {
event.callback_unchecked(&self.0);
}
}