pub fn max<T: AsRef<[f32]>>(values: T) -> f32 {
let values = values.as_ref();
if values.is_empty() { return f32::NAN; }
values.iter().fold(f32::NAN, |a, x| f32::max(a, *x))
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_empty() {
let x: &[f32] = &[];
assert!(max(x).is_nan());
}
#[test]
fn test_nan() {
let x: &[f32] = &[f32::NAN];
assert!(max(x).is_nan());
}
#[test]
fn test_value() {
let x: &[f32] = &[1.0];
assert_eq!(max(x), 1.0);
}
#[test]
fn test_values_ascending() {
let x = &[1.0, 2.0, 3.0];
assert_eq!(max(x), 3.0);
}
#[test]
fn test_values_ascending_and_nans() {
let x = &[1.0, f32::NAN, 2.0, f32::NAN, 3.0];
assert_eq!(max(x), 3.0);
}
#[test]
fn test_values_descending() {
let x = &[3.0, 2.0, 1.0];
assert_eq!(max(x), 3.0);
}
#[test]
fn test_values_descending_and_nans() {
let x = &[3.0, f32::NAN, 2.0, f32::NAN, 1.0];
assert_eq!(max(x), 3.0);
}
}