static-dsp 0.1.0

A no_std dsp library using const generics in Rust.
use super::{Node, ReadableNode, Sample};
use core::mem::MaybeUninit;

pub struct DelayLine<T, const N: usize> {
    buffer: [T; N],
    index: usize,
}

impl<T: Sample, const N: usize> DelayLine<T, N> {
    pub fn new() -> Self {
        let mut delay = unsafe {
            Self {
                buffer: MaybeUninit::uninit().assume_init(),
                index: 0,
            }
        };

        delay.buffer.iter_mut().for_each(|x| *x = T::equilibrium());

        delay
    }
}

impl<T: Sample, const N: usize> Node<T, T> for DelayLine<T, N> {
    #[inline]
    fn process(&mut self, input: T) -> T {
        self.buffer[self.index] = input;

        if (self.index + 1) < self.buffer.len() {
            self.index += 1;
        } else {
            self.index = 0
        }

        self.read()
    }
}

impl<T: Sample, const N: usize> ReadableNode<T> for DelayLine<T, N> {
    #[inline]
    fn read(&self) -> T {
        self.buffer[self.index]
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_should_instansiate() {
        let delay: DelayLine<f32, 10> = DelayLine::new();

        for x in delay.buffer.iter() {
            assert_eq!(x, &f32::default());
        }
    }
}