diff --git a/Cargo.toml b/Cargo.toml index 4e68160..257ef30 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,7 @@ ring = "^0.12" protobuf = "1.4.4" crossbeam = "0.3.2" crossbeam-channel = "0.1" +itertools = "0.7" [build-dependencies] protoc-rust = "1.4.4" diff --git a/src/agreement.rs b/src/agreement.rs index 9a02934..0cf9d94 100644 --- a/src/agreement.rs +++ b/src/agreement.rs @@ -1,5 +1,6 @@ //! Binary Byzantine agreement protocol from a common coin protocol. +use itertools::Itertools; use std::collections::{BTreeMap, BTreeSet, HashMap, VecDeque}; use std::hash::Hash; @@ -210,17 +211,12 @@ impl Agreement { /// can, however, expect every good node to send an AUX value that will /// eventually end up in our bin_values. fn count_aux(&self) -> (usize, BTreeSet) { - let mut count = 0; - let vals: BTreeSet = self.received_aux + let (vals_cnt, vals) = self.received_aux .values() - .filter(|b| { - count += 1; - self.bin_values.contains(b) - }) - .cloned() - .collect(); + .filter(|b| self.bin_values.contains(b)) + .tee(); - (count, vals) + (vals_cnt.count(), vals.cloned().collect()) } /// Waits until at least (N − f) AUX_r messages have been received, such that diff --git a/src/lib.rs b/src/lib.rs index 58deb95..53e63f6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,6 +8,7 @@ extern crate log; extern crate crossbeam; extern crate crossbeam_channel; +extern crate itertools; extern crate merkle; extern crate protobuf; extern crate reed_solomon_erasure;