use std::{
io,
task::{Context, Poll},
};
use futures::Future;
use rasi_syscall::{CancelablePoll, Handle};
pub struct CancelableWouldBlock<F> {
f: F,
cancel_handle: Option<Handle>,
}
impl<F, R> Future for CancelableWouldBlock<F>
where
F: FnMut(&mut Context<'_>) -> CancelablePoll<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) {
CancelablePoll::Ready(v) => Poll::Ready(v),
CancelablePoll::Pending(cancel_handle) => {
self.cancel_handle = Some(cancel_handle);
Poll::Pending
}
}
}
}
pub fn cancelable_would_block<F, R>(f: F) -> CancelableWouldBlock<F>
where
F: FnMut(&mut Context<'_>) -> CancelablePoll<io::Result<R>> + Unpin,
{
CancelableWouldBlock {
f,
cancel_handle: None,
}
}