use std::fmt::Debug;
use crate::{correlated_randomness::CorrelatedBatch, utils::TryFuture};
pub trait CorrelationGenerator<PB: CorrelatedBatch>: Send {
type Net: Send;
type Error: Debug + Clone + Send;
fn run(&mut self, net: &mut Self::Net) -> impl TryFuture<Ok = PB, Error = Self::Error>;
fn run_for(
&mut self,
n_elements: usize,
net: &mut Self::Net,
) -> impl TryFuture<Ok = Vec<PB::Item>, Error = Self::Error> {
let n_batches = n_elements.div_ceil(PB::batch_size());
let mut result = Vec::with_capacity(n_batches * PB::batch_size());
async move {
for _ in 0..n_batches {
let batch = self.run(net).await?;
result.extend(batch.into_iter());
}
Ok(result)
}
}
}