use ::std::io::Write;
mod std;
pub use self::std::*;
pub trait ExtWrite<'a>: Write {
type LockWrite: Write + 'a;
fn lock(&'a self) -> Self::LockWrite;
#[inline(always)]
fn lock_fn<F: FnMut(Self::LockWrite) -> R, R>(&'a self, mut f: F) -> R {
f(self.lock())
}
}
impl<'a, 'l, L: ExtWrite<'a, LockWrite = W>, W: 'a + Write> ExtWrite<'a> for &'l L where Self: Write {
type LockWrite = W;
#[inline(always)]
fn lock(&'a self) -> Self::LockWrite {
L::lock(self)
}
#[inline(always)]
fn lock_fn<F: FnMut(Self::LockWrite) -> R, R>(&'a self, f: F) -> R {
L::lock_fn(self, f)
}
}
impl<'a, 'l, L: ExtWrite<'a, LockWrite = W> + Write, W: 'a + Write> ExtWrite<'a> for &'l mut L where Self: Write {
type LockWrite = W;
#[inline(always)]
fn lock(&'a self) -> Self::LockWrite {
L::lock(self)
}
#[inline(always)]
fn lock_fn<F: FnMut(Self::LockWrite) -> R, R>(&'a self, f: F) -> R {
L::lock_fn(self, f)
}
}