const FEEDBACK: f32 = 0.5;

#[derive(Debug)]
pub struct AllPassFilter {
	buffer: Vec<f32>,
	current_index: usize,
}

impl AllPassFilter {
	#[must_use]
	pub fn new(buffer_size: usize) -> Self {
		Self {
			buffer: vec![0.0; buffer_size],
			current_index: 0,
		}
	}

	#[must_use]
	pub fn process(&mut self, input: f32) -> f32 {
		let buffer_output = self.buffer[self.current_index];
		let output = -input + buffer_output;
		self.buffer[self.current_index] = input + buffer_output * FEEDBACK;
		self.current_index += 1;
		self.current_index %= self.buffer.len();
		output
	}
}
