#[derive(Clone, Copy, Debug, PartialEq, PartialOrd)]
pub struct WavelengthMeters(f64);
impl WavelengthMeters {
#[must_use]
pub fn new(value: f64) -> Option<Self> {
if is_valid_positive_scalar(value) {
Some(Self(value))
} else {
None
}
}
#[must_use]
pub fn value(self) -> f64 {
self.0
}
}
#[must_use]
pub fn wavelength_meters(frequency_hz: f64, speed_mps: f64) -> Option<f64> {
if !is_valid_positive_scalar(frequency_hz) || !is_valid_positive_scalar(speed_mps) {
return None;
}
Some(speed_mps / frequency_hz)
}
#[must_use]
pub fn frequency_from_wavelength_hz(wavelength_meters: f64, speed_mps: f64) -> Option<f64> {
if !is_valid_positive_scalar(wavelength_meters) || !is_valid_positive_scalar(speed_mps) {
return None;
}
Some(speed_mps / wavelength_meters)
}
fn is_valid_positive_scalar(value: f64) -> bool {
value.is_finite() && value > 0.0
}