use crate::deferred::*;
pub enum Context<S> {
State(S),
Deferred(Box<Deferred<S>>),
}
impl<S> Context<S> {
pub fn is_state(&self) -> bool {
if let Context::State(_) = self {
true
} else {
false
}
}
pub fn is_deferred(&self) -> bool {
if let Context::Deferred(_) = self {
true
} else {
false
}
}
pub fn get_state(&self) -> Option<&S> {
match self {
Context::State(state) => Some(state),
Context::Deferred(deferred) => deferred.state(),
}
}
pub fn get_deferred(&self) -> Option<&Deferred<S>> {
if let Context::Deferred(deferred) = self {
Some(deferred)
} else {
None
}
}
pub fn state(self) -> S {
match self {
Context::State(state) => state,
Context::Deferred(deferred) => deferred.consume(),
}
}
pub fn deferred(self) -> Deferred<S> {
if let Context::Deferred(deferred) = self {
*deferred
} else {
panic!("Trying to get deferred execution of context that does not have a deferred execution")
}
}
#[inline]
pub fn unwrap(self) -> S {
self.state()
}
}