use std::{
fmt::Debug,
ops::{Add, AddAssign, Sub, SubAssign},
};
use crate::correlated_randomness::bundler::errors::BundlerError;
pub mod errors;
pub trait Bundler {
type Iterator: BundleIterator;
fn fetch(
&mut self,
size: &<Self::Iterator as BundleIterator>::Size,
) -> Result<Self::Iterator, BundlerError>;
fn fetch_for<Consumer: BundleConsumer<Iterator = Self::Iterator>>(
&mut self,
consumer: &Consumer,
) -> Result<Self::Iterator, BundlerError> {
let size = consumer.required_preprocessing();
self.fetch(&size)
}
}
impl<B: Bundler> Bundler for &mut B {
type Iterator = B::Iterator;
fn fetch(
&mut self,
size: &<Self::Iterator as BundleIterator>::Size,
) -> Result<Self::Iterator, BundlerError> {
(**self).fetch(size)
}
}
pub trait BundleConsumer {
type Iterator: BundleIterator;
fn required_preprocessing(&self) -> <Self::Iterator as BundleIterator>::Size;
fn fetch_preprocessing_from<PB: Bundler<Iterator = Self::Iterator>>(
&self,
bundler: &mut PB,
) -> Result<Self::Iterator, BundlerError> {
let size = self.required_preprocessing();
bundler.fetch(&size)
}
}
pub trait BundleIterator {
type Size: Debug + Clone + Default + Eq + Add + Sub + AddAssign + SubAssign;
fn len(&self) -> Self::Size;
fn is_empty(&self) -> bool {
self.len() == Self::Size::default()
}
}