mod context;
mod guard;
mod options;
pub mod raw;
mod reserve;
pub use context::Context;
pub use guard::Guard;
pub use options::Options;
pub use reserve::Reserve;
use crate::io::reactor::Full;
pub trait Admit<C: Context>: Sized {
type Admission<'a>: Guard<C> + raw::Retain<C>
where
Self: 'a;
fn try_admit(&mut self) -> Result<Self::Admission<'_>, Full>;
}
pub trait Submission: Sized {
fn submit(self) -> Cancelled;
}
pub trait Plan {
type Guard<'a, C: Context, B: Backend<C> + 'a>: Reserve<'a, C, B>;
}
pub struct Pending<const FAMILY: u8>;
pub struct Immediate;
pub trait Backend<C: Context>: Sized {
type Pending<'a, const FAMILY: u8>: Reserve<'a, C, Self>
where
Self: 'a;
type Immediate<'a>: Reserve<'a, C, Self>
where
Self: 'a;
}
impl<const FAMILY: u8> Plan for Pending<FAMILY> {
type Guard<'a, C: Context, B: Backend<C> + 'a> = B::Pending<'a, FAMILY>;
}
impl Plan for Immediate {
type Guard<'a, C: Context, B: Backend<C> + 'a> = B::Immediate<'a>;
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Cancelled {
Submitted,
Queued,
Completed,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct Absent;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct Submitted;
pub trait Native {
type Error<F>;
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Cause<F> {
Absent(Absent),
Reactor(F),
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Error<E> {
Full(Full),
Rejected(E),
}