use std::{
future::Future,
pin::Pin,
task::{Context, Poll},
};
use tokio::sync::oneshot::{Receiver as OneshotReceiver, Sender as OneshotSender};
use crate::correlated_randomness::{stream::CorrelatedStreamError, CorrelatedBatch};
pub struct PrefetchHandle<E> {
receiver: OneshotReceiver<Result<(), E>>,
}
impl<E> From<OneshotReceiver<Result<(), E>>> for PrefetchHandle<E> {
fn from(receiver: OneshotReceiver<Result<(), E>>) -> Self {
Self { receiver }
}
}
impl<E: From<CorrelatedStreamError>> Future for PrefetchHandle<E> {
type Output = Result<(), E>;
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
Pin::new(&mut self.receiver)
.poll(cx)
.map(|r| r.unwrap_or_else(|_| Err(CorrelatedStreamError::StreamClosed.into())))
}
}
pub enum Command<PB: CorrelatedBatch, E> {
RequestN {
n_elements: usize,
completion: OneshotSender<Result<Vec<PB::Item>, E>>,
},
Prefetch {
n_elements: usize,
completion: OneshotSender<Result<(), E>>,
},
}