use dasp_sample::{FromSample, ToSample};
use std::marker::PhantomData;
#[derive(Clone, Debug)]
pub struct SampleTypeConverter<I, O> {
input: I,
marker: PhantomData<O>,
}
impl<I, O> SampleTypeConverter<I, O> {
#[inline]
pub fn new(input: I) -> SampleTypeConverter<I, O> {
SampleTypeConverter {
input,
marker: PhantomData,
}
}
#[inline]
pub fn into_inner(self) -> I {
self.input
}
#[inline]
pub fn inner_mut(&mut self) -> &mut I {
&mut self.input
}
}
impl<I, O> Iterator for SampleTypeConverter<I, O>
where
I: Iterator,
I::Item: ToSample<O>,
{
type Item = O;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.input.next().map(|s| s.to_sample_())
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.input.size_hint()
}
}
impl<I, O> ExactSizeIterator for SampleTypeConverter<I, O>
where
I: ExactSizeIterator,
O: FromSample<I::Item>,
{
}