mirror of
https://github.com/bitcoinresearchkit/brk.git
synced 2026-05-25 17:24:47 -07:00
106 lines
3.1 KiB
Rust
106 lines
3.1 KiB
Rust
use brk_traversable::Traversable;
|
|
use rayon::prelude::*;
|
|
use vecdb::AnyExportableVec;
|
|
|
|
use crate::Filter;
|
|
|
|
use super::{ByAmountRange, ByGreatEqualAmount, ByLowerThanAmount};
|
|
|
|
#[derive(Default, Clone)]
|
|
pub struct AddressGroups<T> {
|
|
pub ge_amount: ByGreatEqualAmount<T>,
|
|
pub amount_range: ByAmountRange<T>,
|
|
pub lt_amount: ByLowerThanAmount<T>,
|
|
}
|
|
|
|
impl<T> AddressGroups<T> {
|
|
pub fn new<F>(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<Item = &T> {
|
|
self.ge_amount
|
|
.iter()
|
|
.chain(self.amount_range.iter())
|
|
.chain(self.lt_amount.iter())
|
|
}
|
|
|
|
pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut T> {
|
|
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<Item = &mut T>
|
|
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<Item = &T> {
|
|
self.amount_range.iter()
|
|
}
|
|
|
|
pub fn iter_separate_mut(&mut self) -> impl Iterator<Item = &mut T> {
|
|
self.amount_range.iter_mut()
|
|
}
|
|
|
|
pub fn par_iter_separate_mut(&mut self) -> impl ParallelIterator<Item = &mut T>
|
|
where
|
|
T: Send + Sync,
|
|
{
|
|
self.amount_range.par_iter_mut()
|
|
}
|
|
|
|
pub fn iter_overlapping_mut(&mut self) -> impl Iterator<Item = &mut T> {
|
|
self.lt_amount.iter_mut().chain(self.ge_amount.iter_mut())
|
|
}
|
|
}
|
|
|
|
impl<T> Traversable for AddressGroups<T>
|
|
where
|
|
ByGreatEqualAmount<T>: brk_traversable::Traversable,
|
|
ByAmountRange<T>: brk_traversable::Traversable,
|
|
ByLowerThanAmount<T>: 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<Item = &dyn AnyExportableVec> {
|
|
[
|
|
Box::new(self.ge_amount.iter_any_exportable())
|
|
as Box<dyn Iterator<Item = &dyn AnyExportableVec>>,
|
|
Box::new(self.amount_range.iter_any_exportable())
|
|
as Box<dyn Iterator<Item = &dyn AnyExportableVec>>,
|
|
Box::new(self.lt_amount.iter_any_exportable())
|
|
as Box<dyn Iterator<Item = &dyn AnyExportableVec>>,
|
|
]
|
|
.into_iter()
|
|
.flatten()
|
|
}
|
|
}
|