rstmt_core/
freq.rs

1/*
2    Appellation: freq <module>
3    Created At: 2025.12.29:17:13:00
4    Contrib: @FL03
5*/
6mod impl_freq;
7mod impl_freq_ext;
8mod impl_freq_rand;
9mod impl_freq_repr;
10
11/// [`RawFrequency`] is a marker trait denoting objects capable of representing a frequency
12pub trait RawFrequency {
13    private! {}
14}
15
16/// [`AsFrequency`] is a trait enabling the conversion of a reference to a type into a
17/// [`Frequency`] instance.
18pub trait AsFrequency<T> {
19    /// Converts the current value into a [`Frequency`] instance.
20    fn as_frequency(&self) -> Frequency<T>;
21}
22/// The [`IntoFrequency`] trait consumes the value and converts it into a [`Frequency`].
23pub trait IntoFrequency<T> {
24    /// Converts the current value into a [`Frequency`] instance.
25    fn into_frequency(self) -> Frequency<T>;
26}
27
28/// The [`Frequency`] type is a generic wrapper around type `T` that implements the
29/// [`RawFrequency`] trait. This implementation is designed to provide a consistent interface
30/// for dealing with frequencies within the crate, enabling conversion, arithmetic operations,
31/// and other utilities that are common to frequency values.
32#[derive(Clone, Copy, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
33#[cfg_attr(
34    feature = "serde",
35    derive(serde::Deserialize, serde::Serialize),
36    serde(transparent)
37)]
38#[repr(transparent)]
39pub struct Frequency<T = f64>(pub T);
40
41/*
42 ************* Implementations *************
43*/
44impl<U, T> IntoFrequency<T> for U
45where
46    U: Into<Frequency<T>>,
47{
48    fn into_frequency(self) -> Frequency<T> {
49        self.into()
50    }
51}
52
53macro_rules! raw_frequency {
54    (@impl $T:ty) => {
55        impl RawFrequency for $T {
56            seal! {}
57        }
58    };
59    {$($T:ty),* $(,)?} => {
60        $(raw_frequency!(@impl $T);)*
61    };
62}
63
64raw_frequency! {
65    f32, f64,
66    i8, i16, i32, i64, i128, isize,
67    u8, u16, u32, u64, u128, usize
68}
69
70#[cfg(feature = "complex")]
71impl<T> RawFrequency for num_complex::Complex<T>
72where
73    T: RawFrequency,
74{
75    seal! {}
76}
77
78#[cfg(test)]
79mod tests {
80    use super::*;
81
82    const A4: f64 = 440.0;
83    const C4: f64 = 261.6255653005986;
84
85    #[test]
86    fn test_freq_classification() {
87        let f = Frequency::new(C4);
88        assert_eq! { f.classify_by(A4), -9 }
89    }
90}