use super::ParallelQueryBuilder;
use rayon::prelude::*;
use std::collections::HashMap;
use std::hash::Hash;
use std::iter::Sum;
impl<T: Send + 'static, State> ParallelQueryBuilder<T, State> {
pub fn collect<B>(self) -> B
where
B: FromIterator<T>,
{
self.items.into_iter().collect()
}
pub fn par_count(self) -> usize {
self.items.len()
}
pub fn par_sum(self) -> T
where
T: Sum + Send,
{
self.items.into_par_iter().sum()
}
pub fn par_min(self) -> Option<T>
where
T: Ord + Send,
{
self.items.into_par_iter().min()
}
pub fn par_max(self) -> Option<T>
where
T: Ord + Send,
{
self.items.into_par_iter().max()
}
pub fn par_min_by<K, F>(self, key: F) -> Option<T>
where
K: Ord + Send,
F: Fn(&T) -> K + Sync + Send,
{
self.items.into_par_iter().min_by_key(|x| key(x))
}
pub fn par_max_by<K, F>(self, key: F) -> Option<T>
where
K: Ord + Send,
F: Fn(&T) -> K + Sync + Send,
{
self.items.into_par_iter().max_by_key(|x| key(x))
}
pub fn par_any<F>(self, predicate: F) -> bool
where
T: Sync,
F: Fn(&T) -> bool + Sync + Send,
{
self.items.par_iter().any(predicate)
}
pub fn par_all<F>(self, predicate: F) -> bool
where
T: Sync,
F: Fn(&T) -> bool + Sync + Send,
{
self.items.par_iter().all(predicate)
}
pub fn par_group_by<K, F>(self, key: F) -> HashMap<K, Vec<T>>
where
K: Eq + Hash + Send,
F: Fn(&T) -> K + Sync + Send,
{
self.items
.into_par_iter()
.fold(
|| HashMap::<K, Vec<T>>::new(),
|mut acc, item| {
acc.entry(key(&item)).or_default().push(item);
acc
},
)
.reduce(
|| HashMap::new(),
|mut a, b| {
for (k, v) in b {
a.entry(k).or_default().extend(v);
}
a
},
)
}
}