use core::ops::{Add, Div, Mul, Sub};
#[derive(Debug)]
pub struct LinearInterpolationInvalidValuesError;
pub fn linear_interpolation<T>(
min_in: T,
max_in: T,
current_in: T,
min_out: T,
max_out: T,
) -> Result<T, LinearInterpolationInvalidValuesError>
where
T: Add<Output = T> + Sub<Output = T> + Mul<Output = T> + Div<Output = T> + PartialOrd + Clone,
{
if min_in > max_in || current_in < min_in || current_in > max_in {
return Err(LinearInterpolationInvalidValuesError);
}
let min_out_weighted = min_out * (max_in.clone() - current_in.clone());
let max_out_weighted = max_out * (current_in - min_in.clone());
let in_diff = max_in - min_in;
let result = (min_out_weighted + max_out_weighted) / in_diff;
Ok(result)
}