use std::fmt;
use std::cell::RefCell;
use std::io::{Write, Stdout, Stderr, Error};
use std::fmt::Debug;
use crate::*;
pub trait GcWrite: GcCompat + Write {}
impl<T> GcWrite for T where T: GcCompat + Write {}
#[derive(Copy, Clone, GcCompat)]
pub struct DynWrite(GcCow<RefCell<Box<dyn GcWrite>>>);
impl DynWrite {
pub fn new(write: impl GcWrite + 'static) -> Self {
Self( GcCow::new( RefCell::new( Box::new( write ) ) ) )
}
pub fn write_fmt(&self, fmt: fmt::Arguments<'_>) -> Result<(), Error> {
self.0.call_ref_unchecked(
|refcell| refcell.borrow_mut().write_fmt(fmt)
)
}
}
impl Debug for DynWrite {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_tuple("DynWrite").finish()
}
}
impl GcCompat for Stdout {
fn points_to(&self, _buffer: &mut std::collections::HashSet<usize>) {}
}
impl GcCompat for Stderr {
fn points_to(&self, _buffer: &mut std::collections::HashSet<usize>) {}
}