use ferray_core::Array;
use ferray_core::dimension::Dimension;
use ferray_core::dtype::Element;
use ferray_core::error::FerrayResult;
use num_traits::Float;
use crate::MaskedArray;
pub fn masked_where<T: Element + Copy, D: Dimension>(
condition: &Array<bool, D>,
data: &Array<T, D>,
) -> FerrayResult<MaskedArray<T, D>> {
MaskedArray::new(data.clone(), condition.clone())
}
pub fn masked_invalid<T: Element + Float, D: Dimension>(
data: &Array<T, D>,
) -> FerrayResult<MaskedArray<T, D>> {
let mask_data: Vec<bool> = data.iter().map(|v| v.is_nan() || v.is_infinite()).collect();
let mask = Array::from_vec(data.dim().clone(), mask_data)?;
MaskedArray::new(data.clone(), mask)
}
pub fn masked_equal<T: Element + PartialEq + Copy, D: Dimension>(
data: &Array<T, D>,
value: T,
) -> FerrayResult<MaskedArray<T, D>> {
let mask_data: Vec<bool> = data.iter().map(|v| *v == value).collect();
let mask = Array::from_vec(data.dim().clone(), mask_data)?;
MaskedArray::new(data.clone(), mask)
}
pub fn masked_not_equal<T: Element + PartialEq + Copy, D: Dimension>(
data: &Array<T, D>,
value: T,
) -> FerrayResult<MaskedArray<T, D>> {
let mask_data: Vec<bool> = data.iter().map(|v| *v != value).collect();
let mask = Array::from_vec(data.dim().clone(), mask_data)?;
MaskedArray::new(data.clone(), mask)
}
pub fn masked_greater<T: Element + PartialOrd + Copy, D: Dimension>(
data: &Array<T, D>,
value: T,
) -> FerrayResult<MaskedArray<T, D>> {
let mask_data: Vec<bool> = data.iter().map(|v| *v > value).collect();
let mask = Array::from_vec(data.dim().clone(), mask_data)?;
MaskedArray::new(data.clone(), mask)
}
pub fn masked_less<T: Element + PartialOrd + Copy, D: Dimension>(
data: &Array<T, D>,
value: T,
) -> FerrayResult<MaskedArray<T, D>> {
let mask_data: Vec<bool> = data.iter().map(|v| *v < value).collect();
let mask = Array::from_vec(data.dim().clone(), mask_data)?;
MaskedArray::new(data.clone(), mask)
}
pub fn masked_greater_equal<T: Element + PartialOrd + Copy, D: Dimension>(
data: &Array<T, D>,
value: T,
) -> FerrayResult<MaskedArray<T, D>> {
let mask_data: Vec<bool> = data.iter().map(|v| *v >= value).collect();
let mask = Array::from_vec(data.dim().clone(), mask_data)?;
MaskedArray::new(data.clone(), mask)
}
pub fn masked_less_equal<T: Element + PartialOrd + Copy, D: Dimension>(
data: &Array<T, D>,
value: T,
) -> FerrayResult<MaskedArray<T, D>> {
let mask_data: Vec<bool> = data.iter().map(|v| *v <= value).collect();
let mask = Array::from_vec(data.dim().clone(), mask_data)?;
MaskedArray::new(data.clone(), mask)
}
pub fn masked_inside<T: Element + PartialOrd + Copy, D: Dimension>(
data: &Array<T, D>,
v1: T,
v2: T,
) -> FerrayResult<MaskedArray<T, D>> {
let mask_data: Vec<bool> = data.iter().map(|v| *v >= v1 && *v <= v2).collect();
let mask = Array::from_vec(data.dim().clone(), mask_data)?;
MaskedArray::new(data.clone(), mask)
}
pub fn masked_outside<T: Element + PartialOrd + Copy, D: Dimension>(
data: &Array<T, D>,
v1: T,
v2: T,
) -> FerrayResult<MaskedArray<T, D>> {
let mask_data: Vec<bool> = data.iter().map(|v| *v < v1 || *v > v2).collect();
let mask = Array::from_vec(data.dim().clone(), mask_data)?;
MaskedArray::new(data.clone(), mask)
}