56 lines
1.4 KiB
Rust
56 lines
1.4 KiB
Rust
extern crate rusty_dsp;
|
|
|
|
use rusty_dsp::error::DspError;
|
|
|
|
pub struct SymbolGenerator<'a> {
|
|
space_freq: f32,
|
|
mark_freq: f32,
|
|
iterator: Box<dyn Iterator<Item = Result<bool, DspError>> + 'a>,
|
|
}
|
|
|
|
impl<'a> SymbolGenerator<'a> {
|
|
pub fn from<I>(iterator: I, space_freq: f32, mark_freq: f32) -> SymbolGenerator<'a>
|
|
where
|
|
I: Iterator<Item = Result<bool, DspError>> + 'a,
|
|
{
|
|
SymbolGenerator {
|
|
space_freq: space_freq,
|
|
mark_freq: mark_freq,
|
|
iterator: Box::new(iterator),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<'a> Iterator for SymbolGenerator<'a> {
|
|
type Item = Result<f32, DspError>;
|
|
|
|
fn next(&mut self) -> Option<Self::Item> {
|
|
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<Vec<f32>, DspError> = generator.collect();
|
|
assert_eq!(result_data, Ok(vec![42000.0, 23000.0, 42000.0]));
|
|
}
|
|
}
|