use brk_traversable::Traversable; use rayon::prelude::*; use vecdb::AnyExportableVec; use crate::Filter; use super::{ByAmountRange, ByGreatEqualAmount, ByLowerThanAmount}; #[derive(Default, Clone)] pub struct AddressGroups { pub ge_amount: ByGreatEqualAmount, pub amount_range: ByAmountRange, pub lt_amount: ByLowerThanAmount, } impl AddressGroups { pub fn new(mut create: F) -> Self where F: FnMut(Filter) -> T, { Self { ge_amount: ByGreatEqualAmount::new(&mut create), amount_range: ByAmountRange::new(&mut create), lt_amount: ByLowerThanAmount::new(&mut create), } } pub fn iter(&self) -> impl Iterator { self.ge_amount .iter() .chain(self.amount_range.iter()) .chain(self.lt_amount.iter()) } pub fn iter_mut(&mut self) -> impl Iterator { self.ge_amount .iter_mut() .chain(self.amount_range.iter_mut()) .chain(self.lt_amount.iter_mut()) } pub fn par_iter_mut(&mut self) -> impl ParallelIterator where T: Send + Sync, { self.ge_amount .par_iter_mut() .chain(self.amount_range.par_iter_mut()) .chain(self.lt_amount.par_iter_mut()) } pub fn iter_separate(&self) -> impl Iterator { self.amount_range.iter() } pub fn iter_separate_mut(&mut self) -> impl Iterator { self.amount_range.iter_mut() } pub fn par_iter_separate_mut(&mut self) -> impl ParallelIterator where T: Send + Sync, { self.amount_range.par_iter_mut() } pub fn iter_overlapping_mut(&mut self) -> impl Iterator { self.lt_amount.iter_mut().chain(self.ge_amount.iter_mut()) } } impl Traversable for AddressGroups where ByGreatEqualAmount: brk_traversable::Traversable, ByAmountRange: brk_traversable::Traversable, ByLowerThanAmount: brk_traversable::Traversable, T: Send + Sync, { fn to_tree_node(&self) -> brk_traversable::TreeNode { brk_traversable::TreeNode::Branch( [ (String::from("ge_amount"), self.ge_amount.to_tree_node()), ( String::from("amount_range"), self.amount_range.to_tree_node(), ), (String::from("lt_amount"), self.lt_amount.to_tree_node()), ] .into(), ) } fn iter_any_exportable(&self) -> impl Iterator { [ Box::new(self.ge_amount.iter_any_exportable()) as Box>, Box::new(self.amount_range.iter_any_exportable()) as Box>, Box::new(self.lt_amount.iter_any_exportable()) as Box>, ] .into_iter() .flatten() } }