use crate::coro::Coro;
use crate::suspended::Suspended;
use crate::suspended::SuspendedVisitor;
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
pub enum Suspend<Y, R, N> {
Yield(Y, N),
Return(R),
}
use Suspend::*;
impl<Y, R, N> Suspend<Y, R, N> {
pub fn into_yield(self) -> Option<(Y, N)> {
match self {
Yield(y, n) => Some((y, n)),
Return(_) => None,
}
}
pub fn into_return(self) -> Option<R> {
match self {
Yield(_, _) => None,
Return(r) => Some(r),
}
}
}
impl<I, Y, R, N> Suspended<I, Y, R> for Suspend<Y, R, N>
where
N: Coro<I, Y, R>,
{
type Next = N;
fn visit<X>(
self,
visitor: impl SuspendedVisitor<I, Y, R, N, Out = X>,
) -> X {
match self {
Yield(y, next) => visitor.on_yield(y, next),
Return(r) => visitor.on_return(r),
}
}
fn into_enum(self) -> Suspend<Y, R, N> {
self
}
}