use super::ParallelQueryBuilder;
use crate::core::state::{Filtered, Sorted};
use rayon::prelude::*;
use std::marker::PhantomData;
impl<T: Send + 'static> ParallelQueryBuilder<T, Filtered> {
pub fn par_where<F>(self, predicate: F) -> ParallelQueryBuilder<T, Filtered>
where
F: Fn(&T) -> bool + Sync + Send,
{
let items: Vec<T> = self
.items
.into_par_iter()
.filter(|x| predicate(x))
.collect();
ParallelQueryBuilder {
items,
_state: PhantomData,
}
}
pub fn par_select<U, F>(self, f: F) -> ParallelQueryBuilder<U, Filtered>
where
U: Send + 'static,
F: Fn(T) -> U + Sync + Send,
{
let items: Vec<U> = self.items.into_par_iter().map(f).collect();
ParallelQueryBuilder {
items,
_state: PhantomData,
}
}
pub fn par_flat_map<U, I, F>(self, f: F) -> ParallelQueryBuilder<U, Filtered>
where
U: Send + 'static,
I: IntoIterator<Item = U>,
F: Fn(T) -> I + Sync + Send,
{
let items: Vec<U> = self.items.into_par_iter().flat_map_iter(f).collect();
ParallelQueryBuilder {
items,
_state: PhantomData,
}
}
pub fn par_order_by<K, F>(self, key: F) -> ParallelQueryBuilder<T, Sorted>
where
K: Ord,
F: Fn(&T) -> K + Sync,
T: Send,
{
let mut items = self.items;
items.par_sort_by_key(|x| key(x));
ParallelQueryBuilder {
items,
_state: PhantomData,
}
}
}