use std::{future::Future, io, task::Context};
use std::task::Poll;
pub struct WouldBlock<F> {
f: F,
}
impl<F, R> Future for WouldBlock<F>
where
F: FnMut(&mut Context<'_>) -> io::Result<R> + Unpin,
{
type Output = io::Result<R>;
fn poll(mut self: std::pin::Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
match (self.f)(cx) {
Ok(r) => Poll::Ready(Ok(r)),
Err(err) if err.kind() == io::ErrorKind::WouldBlock => Poll::Pending,
Err(err) => Poll::Ready(Err(err)),
}
}
}
pub fn would_block<F, R>(f: F) -> WouldBlock<F>
where
F: FnMut(&mut Context<'_>) -> io::Result<R> + Unpin,
{
WouldBlock { f }
}
pub fn poll_would_block<F, R>(f: F) -> Poll<io::Result<R>>
where
F: FnOnce() -> io::Result<R> + Unpin,
{
match f() {
Ok(r) => Poll::Ready(Ok(r)),
Err(err) if err.kind() == io::ErrorKind::WouldBlock => Poll::Pending,
Err(err) => Poll::Ready(Err(err)),
}
}