use ndarray::{ArrayBase, AsArray, Dimension, ViewRepr, Zip};
#[inline]
pub fn max<'a, T, A, D>(data: A) -> T
where
A: AsArray<'a, T, D>,
D: Dimension,
T: 'a + PartialOrd + Clone + Sync,
{
let view: ArrayBase<ViewRepr<&'a T>, D> = data.into();
let arbitrary_value = view.first().unwrap();
let max = Zip::from(&view).fold(arbitrary_value, |acc, v| if v > acc { v } else { acc });
max.clone()
}
#[inline]
pub fn min<'a, T, A, D>(data: A) -> T
where
A: AsArray<'a, T, D>,
D: Dimension,
T: 'a + PartialOrd + Clone + Sync,
{
let view: ArrayBase<ViewRepr<&'a T>, D> = data.into();
let arbitrary_value = view.first().unwrap();
let max = Zip::from(&view).fold(arbitrary_value, |acc, v| if v < acc { v } else { acc });
max.clone()
}
#[inline]
pub fn min_max<'a, T, A, D>(data: A) -> (T, T)
where
A: AsArray<'a, T, D>,
D: Dimension,
T: 'a + PartialOrd + Clone + Sync,
{
let view: ArrayBase<ViewRepr<&'a T>, D> = data.into();
let arbitrary_value = view.first().unwrap();
let mm = Zip::from(&view).fold((arbitrary_value, arbitrary_value), |acc, v| {
(
if v < acc.0 { v } else { acc.0 },
if v > acc.1 { v } else { acc.1 },
)
});
(mm.0.clone(), mm.1.clone())
}