use std::cell::RefCell;
use std::io::{self, Read, Write};
use std::rc::Rc;
#[derive(Debug)]
pub struct RcIo<T>(Rc<RefCell<T>>);
impl<T> RcIo<T> {
pub fn wrap(inner: T) -> Self {
RcIo(Rc::new(RefCell::new(inner)))
}
}
impl<T> Clone for RcIo<T> {
fn clone(&self) -> Self {
RcIo(Rc::clone(&self.0))
}
}
impl<T: Read> Read for RcIo<T> {
fn read(&mut self, dst: &mut [u8]) -> io::Result<usize> {
self.0.borrow_mut().read(dst)
}
}
impl<T: Write> Write for RcIo<T> {
fn write(&mut self, src: &[u8]) -> io::Result<usize> {
self.0.borrow_mut().write(src)
}
fn flush(&mut self) -> io::Result<()> {
self.0.borrow_mut().flush()
}
}