use crate::{error::QuantorKind, QuantorError};
#[inline]
#[must_use = "Quantifier results must be checked. Use `.is_ok()` or `?` to handle them."]
pub fn pairwise<'a, I, T: 'a, F>(iter: I, pred: F) -> Result<(), QuantorError>
where
I: IntoIterator<Item = &'a T>,
F: Fn(&T, &T) -> bool,
{
let mut iter = iter.into_iter();
let mut prev = match iter.next() {
Some(p) => p,
None => return Ok(())
};
let mut index = 0;
for curr in iter {
if !pred(prev, curr) {
return Err(QuantorError::PairwiseFailed { kind: QuantorKind::Pairwise, index });
}
prev = curr;
index += 1;
}
Ok(())
}
#[inline]
#[must_use = "Use this to inspect failing elements from a quantifier."]
pub fn failing_elements<'a, I, T: 'a, F>(iter: I, pred: F) -> Vec<&'a T>
where
I: IntoIterator<Item = &'a T>,
F: Fn(&T) -> bool,
{
iter.into_iter().filter(|x| !pred(x)).collect()
}