From fe41702fd1c285fed71742c02b19857116b17ab1 Mon Sep 17 00:00:00 2001
From: Stephen D <webmaster@scd31.com>
Date: Wed, 31 May 2023 22:53:53 -0300
Subject: [PATCH] use iterator for input

---
 Cargo.toml |  2 +-
 src/lib.rs | 25 +++++++++++++------------
 2 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/Cargo.toml b/Cargo.toml
index 517686c..88c3d98 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 edition = "2021"
 name = "goertzel-nostd"
-version = "0.2.1"
+version = "0.3.0"
 authors = ["Stephen D"]
 repository = "https://gitlab.scd31.com/stephen/goertzel-nostd"
 keywords = ["dsp", "goertzel", "fft", "fourier"]
diff --git a/src/lib.rs b/src/lib.rs
index dbf67cb..ae0197b 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -4,7 +4,7 @@
 // allow std in tests
 #![cfg_attr(not(test), no_std)]
 
-use core::f32::consts::PI;
+use core::{borrow::Borrow, f32::consts::PI};
 
 /// Set up parameters (and some precomputed values for those).
 #[derive(Clone, Copy)]
@@ -46,23 +46,24 @@ impl Parameters {
 		}
 	}
 
-	pub fn mag(self, samples: &[f32]) -> f32 {
+	pub fn mag<V: Borrow<f32>, I: Iterator<Item = V>>(self, samples: I) -> f32 {
 		self.start().add_samples(samples).finish_mag()
 	}
 
-	pub fn mag_squared(self, samples: &[f32]) -> f32 {
+	pub fn mag_squared<V: Borrow<f32>, I: Iterator<Item = V>>(self, samples: I) -> f32 {
 		self.start().add_samples(samples).finish_mag_squared()
 	}
 }
 
 impl Partial {
-	pub fn add_samples(mut self, samples: &[f32]) -> Self {
-		for &sample in samples {
-			let this = self.params.term_coefficient * self.prev - self.prevprev + sample;
+	pub fn add_samples<V: Borrow<f32>, I: Iterator<Item = V>>(mut self, samples: I) -> Self {
+		for sample in samples {
+			let this = self.params.term_coefficient * self.prev - self.prevprev + sample.borrow();
 			self.prevprev = self.prev;
 			self.prev = this;
+			self.count += 1;
 		}
-		self.count += samples.len();
+
 		self
 	}
 	pub fn finish(self) -> (f32, f32) {
@@ -85,11 +86,11 @@ impl Partial {
 #[test]
 fn zero_data() {
 	let p = Parameters::new(1800., 8000, 256);
-	assert!(p.start().add_samples(&[0.0; 256]).finish_mag() == 0.);
+	assert!(p.start().add_samples([0.0; 256].iter()).finish_mag() == 0.);
 	assert!(
 		p.start()
-			.add_samples(&[0.0; 128])
-			.add_samples(&[0.0; 128])
+			.add_samples([0.0; 128].iter())
+			.add_samples([0.0; 128].iter())
 			.finish_mag()
 			== 0.
 	);
@@ -107,10 +108,10 @@ fn sine() {
 		}
 
 		let p = Parameters::new(freq, 8000, 8000);
-		let mag = p.start().add_samples(&buf[..]).finish_mag();
+		let mag = p.start().add_samples(buf[..].iter()).finish_mag();
 		for testfreq in (0..30).map(|x| (x * 100) as f32) {
 			let p = Parameters::new(testfreq, 8000, 8000);
-			let testmag = p.mag(&buf[..]);
+			let testmag = p.mag(&buf[..].iter());
 			println!("{testfreq:4}: {testmag:12.3}");
 			if (freq - testfreq).abs() > 100. {
 				println!("{mag} > 10*{testmag}");
-- 
GitLab