use ndarray::{Array, ArrayBase, AsArray, Dimension, ViewRepr, Zip};
use crate::prelude::*;
#[inline]
pub fn manual_mask<'a, T, A, D>(data: A, threshold: T, threads: Option<usize>) -> Array<bool, D>
where
A: AsArray<'a, T, D>,
D: Dimension,
T: 'a + AsNumeric,
{
let data: ArrayBase<ViewRepr<&'a T>, D> = data.into();
let mask_apply_seq = || {
let mut mask = Array::from_elem(data.dim(), false);
Zip::from(data.view()).and(&mut mask).for_each(|&ip, mp| {
*mp = ip >= threshold;
});
mask
};
let mask_apply_par = || {
let mut mask = Array::from_elem(data.dim(), false);
Zip::from(data.view())
.and(&mut mask)
.par_for_each(|&ip, mp| {
*mp = ip >= threshold;
});
mask
};
par!(threads, seq_exp: mask_apply_seq(), par_exp: mask_apply_par())
}