1mod impl_freq;
7mod impl_freq_ext;
8mod impl_freq_rand;
9mod impl_freq_repr;
10
11pub trait RawFrequency {
13 private! {}
14}
15
16pub trait AsFrequency<T> {
19 fn as_frequency(&self) -> Frequency<T>;
21}
22pub trait IntoFrequency<T> {
24 fn into_frequency(self) -> Frequency<T>;
26}
27
28#[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
41impl<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}