use core::fmt::Debug;
use core::num::NonZeroU32;
use crate::chan::Channel;
use crate::Frame;
pub trait Sink<Chan: Channel, const CH: usize>: Debug {
fn sample_rate(&self) -> NonZeroU32;
fn len(&self) -> usize;
fn sink_with(&mut self, iter: &mut dyn Iterator<Item = Frame<Chan, CH>>);
fn is_empty(&self) -> bool {
self.len() == 0
}
}
#[derive(Debug)]
pub struct SinkTo<Chan, C, S, const CH: usize, const N: usize>
where
Chan: Channel + From<C>,
C: Channel,
S: Sink<Chan, CH>,
{
sink: S,
_phantom: core::marker::PhantomData<(Chan, C)>,
}
impl<Chan, C, S, const CH: usize, const N: usize> SinkTo<Chan, C, S, CH, N>
where
Chan: Channel + From<C>,
C: Channel,
S: Sink<Chan, CH>,
{
pub fn new(sink: S) -> Self {
Self {
sink,
_phantom: core::marker::PhantomData,
}
}
}
#[allow(single_use_lifetimes)]
impl<Chan, C, S, const CH: usize, const N: usize> Sink<C, N>
for &mut SinkTo<Chan, C, S, CH, N>
where
Chan: Channel + From<C>,
C: Channel,
S: Sink<Chan, CH>,
{
fn sample_rate(&self) -> NonZeroU32 {
self.sink.sample_rate()
}
fn len(&self) -> usize {
self.sink.len()
}
fn sink_with(&mut self, iter: &mut dyn Iterator<Item = Frame<C, N>>) {
self.sink.sink_with(&mut iter.map(Frame::to))
}
}
#[allow(single_use_lifetimes)]
impl<Chan, C, S, const CH: usize, const N: usize> Sink<C, N>
for SinkTo<Chan, C, S, CH, N>
where
Chan: Channel + From<C>,
C: Channel,
S: Sink<Chan, CH>,
{
fn sample_rate(&self) -> NonZeroU32 {
self.sink.sample_rate()
}
fn len(&self) -> usize {
self.sink.len()
}
fn sink_with(&mut self, iter: &mut dyn Iterator<Item = Frame<C, N>>) {
self.sink.sink_with(&mut iter.map(Frame::to))
}
}