pub trait IterSink<Item> {
type Error;
fn ready(&mut self) -> Result<(), Self::Error>;
fn start_send(&mut self, item: Item) -> Result<(), Self::Error>;
fn flush(&mut self) -> Result<(), Self::Error>;
}
pub trait IterSinkExt<Item>: IterSink<Item> {
fn send(&mut self, item: Item) -> Result<(), Self::Error> {
self.send_all(std::iter::once(Ok(item)))
}
fn send_all<I>(&mut self, items: I) -> Result<(), Self::Error>
where
I: IntoIterator<Item = Result<Item, Self::Error>>,
{
for item in items {
let item = item?;
self.ready()?;
self.start_send(item)?;
}
self.flush()
}
}
impl<T: ?Sized, Item> IterSinkExt<Item> for T where T: IterSink<Item> {}