mod take;
pub use take::Take;
mod null;
pub use null::{null, Null};
mod repeat;
pub use repeat::{repeat, Repeat};
mod internal;
pub(crate) use internal::*;
use crate::{buffer::Buffer, AsyncRead, AsyncWrite, IoResult};
pub async fn copy<'a, R: AsyncRead, W: AsyncWrite>(
reader: &'a mut R,
writer: &'a mut W,
) -> IoResult<usize> {
let mut buf = Buffer::with_capacity(DEFAULT_BUF_SIZE);
let mut total = 0;
loop {
let read = buf.with(|w| reader.read(w)).await?;
if read == 0 || buf.need_flush() {
let written = buf.flush_to(writer).await?;
total += written;
}
if read == 0 {
writer.flush().await?;
break;
}
}
Ok(total)
}