use std::io;
pub trait DataSource {
type Item: Copy + PartialEq;
fn read(&mut self, _: &mut [Self::Item]) -> io::Result<usize>;
}
#[derive(Debug)]
pub struct ReadDataSource<R: io::Read>(R);
impl<R: io::Read> ReadDataSource<R> {
#[inline]
pub fn new(inner: R) -> Self {
ReadDataSource(inner)
}
#[inline]
pub fn into_inner(self) -> R {
self.0
}
}
impl<R: io::Read> DataSource for ReadDataSource<R> {
type Item = u8;
#[inline]
fn read(&mut self, buffer: &mut [u8]) -> io::Result<usize> {
self.0.read(buffer)
}
}
#[derive(Debug)]
pub struct RWDataSource<RW: io::Read + io::Write>(RW);
impl<RW: io::Read + io::Write> RWDataSource<RW> {
pub fn new(inner: RW) -> Self {
RWDataSource(inner)
}
#[inline]
pub fn into_inner(self) -> RW {
self.0
}
}
impl<RW: io::Read + io::Write> DataSource for RWDataSource<RW> {
type Item = u8;
#[inline]
fn read(&mut self, buffer: &mut [u8]) -> io::Result<usize> {
self.0.read(buffer)
}
}
impl<RW: io::Read + io::Write> io::Write for RWDataSource<RW> {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.0.write(buf)
}
fn flush(&mut self) -> io::Result<()> {
self.0.flush()
}
}
#[derive(Debug)]
pub struct IteratorDataSource<I: Iterator>(I);
impl<I: Iterator> IteratorDataSource<I> {
#[inline]
pub fn new(inner: I) -> Self {
IteratorDataSource(inner)
}
#[inline]
pub fn into_inner(self) -> I {
self.0
}
}
impl<I: Iterator> DataSource for IteratorDataSource<I>
where
I::Item: Copy + PartialEq,
{
type Item = I::Item;
#[inline]
fn read(&mut self, buffer: &mut [I::Item]) -> io::Result<usize> {
let mut n = 0;
while buffer.len() > n {
if let Some(i) = self.0.next() {
buffer[n] = i;
} else {
break;
}
n += 1;
}
Ok(n)
}
}