async-fifo 0.6.5

MPMC & oneshot channels with (a)sync API
Documentation
use std::task::{Context, Waker, Wake, Poll};
use std::thread::{Thread, park, current};
use std::future::Future;
use std::sync::Arc;
use std::pin::pin;

fn current_thread_waker() -> Waker {
    struct ThreadWaker {
        handle: Thread,
    }

    impl Wake for ThreadWaker {
        fn wake(self: Arc<Self>) {
            self.handle.unpark();
        }
    }

    let thread_waker = ThreadWaker {
        handle: current(),
    };

    Arc::new(thread_waker).into()
}

pub fn block_on<T, F: Future<Output = T>>(fut: F) -> T {
    let waker = current_thread_waker();
    let mut context = Context::from_waker(&waker);
    let mut pinned = pin!(fut);

    loop {
        match pinned.as_mut().poll(&mut context) {
            Poll::Ready(retval) => break retval,
            Poll::Pending => park(),
        }
    }
}