use multidouble::precision::Precision;
use multidouble::simd::Native;
pub fn parts(z: &[Vec<f64>]) -> Vec<&[f64]> {
z.iter().map(|p| p.as_slice()).collect()
}
pub fn nan_max(a: f64, b: f64) -> f64 {
if a.is_nan() || b.is_nan() {
f64::NAN
} else {
a.max(b)
}
}
pub fn nan_min(a: f64, b: f64) -> f64 {
if a.is_nan() || b.is_nan() {
f64::NAN
} else {
a.min(b)
}
}
pub fn max_abs<P: Precision<Native>>(x: &[P::Scalar]) -> f64 {
x.iter().map(|&v| P::to_dd(v).hi.abs()).fold(0.0, nan_max)
}
pub fn widen(z: &[Vec<f64>], parts: usize) -> Vec<Vec<f64>> {
assert!(parts >= z.len(), "widen: {} parts into {parts}", z.len());
let l = z.first().map_or(0, |p| p.len());
z.iter()
.cloned()
.chain((z.len()..parts).map(|_| vec![0.0; l]))
.collect()
}