pub trait Coroutine
{
type StartArguments: Sized;
type ResumeArguments: Sized;
type Yields: Sized;
type Complete: Sized;
fn coroutine<'yielder>(start_arguments: Self::StartArguments, yielder: Yielder<'yielder, Self::ResumeArguments, Self::Yields, Self::Complete>) -> Self::Complete;
#[doc(hidden)]
#[inline(never)]
extern "C" fn context_coroutine_wrapper(transfer: Transfer) -> !
{
let mut type_safe_transfer = TypeSafeTransfer::<ParentInstructingChild<Self::ResumeArguments>, ChildOutcome<Self::Yields, Self::Complete>>::wrap(transfer);
let start_child_arguments: Self::StartArguments = type_safe_transfer.start_child_arguments();
let result =
{
let yielder = Yielder::new(&mut type_safe_transfer);
catch_unwind(AssertUnwindSafe(|| Self::coroutine(start_child_arguments, yielder)))
};
type_safe_transfer.resume_drop_safe(ChildOutcome::Complete(result));
unreachable!("Closure has completed")
}
}