pub trait Coroutine: Sized
{
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;
#[inline(always)]
fn start_coroutine<S: Stack>(stack: S, start_arguments: Self::StartArguments) -> StartOutcome<S, Self>
{
CoroutineInstance::new(stack).start(start_arguments)
}
#[doc(hidden)]
#[inline(never)]
extern "C" fn context_entry_point_function_pointer(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));
unsafe { unreachable() }
}
}