Closed
Description
Suggested by @jturner314:
I'd just do it in terms of fold
with something like this (taking advantage of the first
method from PR #507):
impl<A, S, D> ArrayBase<S, D>
where
S: Data<Elem = A>,
D: Dimension,
{
/// Returns the minimum element, or `None` if the array is empty.
fn scalar_min(&self) -> Option<&A>
where
A: Ord,
{
let first = self.first()?;
Some(self.fold(first, |acc, x| acc.min(x)))
}
}
We don't need to manually unroll this because the compiler does a good job automatically (checked with Compiler Explorer using the -O
compiler option).
The desired behavior for floating-point types depends on the use-case because of NaN. One option is
arr.fold(::std::f64::NAN, |acc, &x| acc.min(x))
which ignores NaN values. (It returns NaN only if there are no non-NaN values.) The compiler does a decent job automatically unrolling this, so we don't need to manually unroll in this case either.
Originally posted by @jturner314 in #505 (comment)