diff --git a/crates/fhe/src/mbfv/aggregate.rs b/crates/fhe/src/mbfv/aggregate.rs index ce17799c..9829c3e8 100644 --- a/crates/fhe/src/mbfv/aggregate.rs +++ b/crates/fhe/src/mbfv/aggregate.rs @@ -8,6 +8,7 @@ pub trait Aggregate: Sized { T: IntoIterator; } +#[diagnostic::do_not_recommend] impl Aggregate> for A where A: Aggregate, @@ -35,6 +36,7 @@ pub trait AggregateIter { A: Aggregate; } +#[diagnostic::do_not_recommend] impl, S> AggregateIter for I { type Share = S; @@ -45,3 +47,35 @@ impl, S> AggregateIter for I { Aggregate::from_shares(self) } } + +#[cfg(test)] +mod tests { + use super::{Aggregate, AggregateIter}; + use crate::errors::Result; + + #[derive(Debug, PartialEq, Eq)] + struct Sum(u64); + + impl Aggregate for Sum { + fn from_shares(iter: T) -> Result + where + T: IntoIterator, + { + Ok(Sum(iter.into_iter().sum())) + } + } + + #[test] + fn aggregate_iter_collects_shares() -> Result<()> { + let sum = vec![1u64, 2, 3].into_iter().aggregate::()?; + assert_eq!(sum, Sum(6)); + Ok(()) + } + + #[test] + fn aggregate_result_flattens_shares() -> Result<()> { + let sum = >>::from_shares(vec![Ok(1u64), Ok(2), Ok(3)])?; + assert_eq!(sum, Sum(6)); + Ok(()) + } +}