blob: 0223507118b383257ad2c9473896657b2f39a5fd [file] [log] [blame]
use core::future::Future;
use core::pin::Pin;
use core::task::Context;
use core::task::Poll;
// TODO: Consider using FnMut
pub async fn wait_until<F: Fn() -> bool>(condition: F) {
wait_for_value(move || if condition() { Some(()) } else { None }).await
}
pub async fn wait_for_value<T, F: Fn() -> Option<T>>(value_provider: F) -> T {
WaitForValue { value_provider }.await
}
struct WaitForValue<F> {
value_provider: F,
}
impl<T, F: Fn() -> Option<T>> Future for WaitForValue<F> {
type Output = T;
fn poll(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Self::Output> {
if let Some(value) = (self.value_provider)() {
Poll::Ready(value)
} else {
Poll::Pending
}
}
}