use super::{QueryBuilder, QueryData};
use crate::core::try_builder::TryQueryBuilder;
impl<T: 'static, State> QueryBuilder<T, State> {
pub fn try_select<U, E, F>(self, f: F) -> TryQueryBuilder<U, E>
where
U: 'static,
E: 'static,
F: Fn(T) -> Result<U, E> + 'static,
{
let iter: Box<dyn Iterator<Item = T>> = match self.data {
QueryData::Iterator(iter) => iter,
QueryData::SortedVec { items, .. } => Box::new(items.into_iter()),
};
TryQueryBuilder {
data: Box::new(iter.map(f)),
}
}
pub fn try_where_<E, F>(self, f: F) -> TryQueryBuilder<T, E>
where
E: 'static,
F: Fn(&T) -> Result<bool, E> + 'static,
{
let iter: Box<dyn Iterator<Item = T>> = match self.data {
QueryData::Iterator(iter) => iter,
QueryData::SortedVec { items, .. } => Box::new(items.into_iter()),
};
TryQueryBuilder {
data: Box::new(iter.filter_map(move |x| match f(&x) {
Ok(true) => Some(Ok(x)),
Ok(false) => None,
Err(e) => Some(Err(e)),
})),
}
}
}