spawn_groups 1.1.0

Structured concurrency construct written in Rust, for Rustaceans
Documentation
use crate::shared::Task;

use super::{pair, Suspender};
use std::{
    sync::Arc,
    task::{Context, Poll, Waker},
};

thread_local! {
    pub(crate) static WAKER_PAIR: (Arc<Suspender>, Waker) = {
        pair()
    };
}

#[inline]
pub(crate) fn block_on<T>(mut future: Task<T>, pair: &(Arc<Suspender>, Waker)) -> T {
    let task = Task::from_ref(&mut future);
    let mut context: Context<'_> = Context::from_waker(&pair.1);
    loop {
        match task.poll_task(&mut context) {
            Poll::Pending => pair.0.suspend(),
            Poll::Ready(output) => return output,
        }
    }
}