extern crate rusty_dsp; use rusty_dsp::error::DspError; pub struct SymbolGenerator<'a> { space_freq: f32, mark_freq: f32, iterator: Box> + 'a>, } impl<'a> SymbolGenerator<'a> { pub fn from(iterator: I, space_freq: f32, mark_freq: f32) -> SymbolGenerator<'a> where I: Iterator> + 'a, { SymbolGenerator { space_freq: space_freq, mark_freq: mark_freq, iterator: Box::new(iterator), } } } impl<'a> Iterator for SymbolGenerator<'a> { type Item = Result; fn next(&mut self) -> Option { match self.iterator.next() { Some(Ok(b)) => { if b { Some(Ok(self.mark_freq)) } else { Some(Ok(self.space_freq)) } } None => None, Some(Err(e)) => Some(Err(e)), } } } #[cfg(test)] mod tests { use super::*; #[test] fn test_symbolgenerator() { let input = vec![true, false, true]; let generator = SymbolGenerator::from(input.into_iter().map(|x| Ok(x)), 23000.0, 42000.0); let result_data: Result, DspError> = generator.collect(); assert_eq!(result_data, Ok(vec![42000.0, 23000.0, 42000.0])); } }