primitives/correlated_randomness/bundler/
mod.rs1use std::{
2 fmt::Debug,
3 ops::{Add, AddAssign, Sub, SubAssign},
4};
5
6use crate::correlated_randomness::bundler::errors::BundlerError;
7
8pub mod errors;
9pub trait Bundler {
12 type Iterator: BundleIterator;
14
15 fn fetch(
17 &mut self,
18 size: &<Self::Iterator as BundleIterator>::Size,
19 ) -> Result<Self::Iterator, BundlerError>;
20
21 fn fetch_for<Consumer: BundleConsumer<Iterator = Self::Iterator>>(
23 &mut self,
24 consumer: &Consumer,
25 ) -> Result<Self::Iterator, BundlerError> {
26 let size = consumer.required_preprocessing();
27 self.fetch(&size)
28 }
29}
30
31impl<B: Bundler> Bundler for &mut B {
32 type Iterator = B::Iterator;
33
34 fn fetch(
35 &mut self,
36 size: &<Self::Iterator as BundleIterator>::Size,
37 ) -> Result<Self::Iterator, BundlerError> {
38 (**self).fetch(size)
39 }
40}
41
42pub trait BundleConsumer {
44 type Iterator: BundleIterator;
47
48 fn required_preprocessing(&self) -> <Self::Iterator as BundleIterator>::Size;
50
51 fn fetch_preprocessing_from<PB: Bundler<Iterator = Self::Iterator>>(
53 &self,
54 bundler: &mut PB,
55 ) -> Result<Self::Iterator, BundlerError> {
56 let size = self.required_preprocessing();
57 bundler.fetch(&size)
58 }
59}
60
61pub trait BundleIterator {
63 type Size: Debug + Clone + Default + Eq + Add + Sub + AddAssign + SubAssign;
65
66 fn len(&self) -> Self::Size;
68
69 fn is_empty(&self) -> bool {
71 self.len() == Self::Size::default()
72 }
73}