Skip to main content

use_acoustics/
wavelength.rs

1/// A validated wavelength in meters.
2#[derive(Clone, Copy, Debug, PartialEq, PartialOrd)]
3pub struct WavelengthMeters(f64);
4
5impl WavelengthMeters {
6    /// Creates a validated wavelength in meters.
7    #[must_use]
8    pub fn new(value: f64) -> Option<Self> {
9        if is_valid_positive_scalar(value) {
10            Some(Self(value))
11        } else {
12            None
13        }
14    }
15
16    /// Returns the stored wavelength in meters.
17    #[must_use]
18    pub fn value(self) -> f64 {
19        self.0
20    }
21}
22
23/// Computes wavelength in meters from frequency and propagation speed.
24#[must_use]
25pub fn wavelength_meters(frequency_hz: f64, speed_mps: f64) -> Option<f64> {
26    if !is_valid_positive_scalar(frequency_hz) || !is_valid_positive_scalar(speed_mps) {
27        return None;
28    }
29
30    Some(speed_mps / frequency_hz)
31}
32
33/// Computes frequency in hertz from wavelength and propagation speed.
34#[must_use]
35pub fn frequency_from_wavelength_hz(wavelength_meters: f64, speed_mps: f64) -> Option<f64> {
36    if !is_valid_positive_scalar(wavelength_meters) || !is_valid_positive_scalar(speed_mps) {
37        return None;
38    }
39
40    Some(speed_mps / wavelength_meters)
41}
42
43fn is_valid_positive_scalar(value: f64) -> bool {
44    value.is_finite() && value > 0.0
45}