use super::*;
pub trait Stream: Sized {
fn iread_n<A, E>(
self,
n: usize,
ok: impl FnOnce(&[u8]) -> A,
err: impl FnOnce(&[u8]) -> E,
) -> Result<(A, Self), E>;
fn iread_all<A>(self, ok: impl FnOnce(&[u8]) -> A) -> A;
fn itell(&self) -> usize;
}
pub trait StreamExt<E>: Stream {
fn iread_n_const<const N: usize>(
self,
err: impl FnOnce(&[u8]) -> E,
) -> Result<([u8; N], Self), E> {
self.iread_n(
N,
|slice| slice.try_into().expect("`iread_n` wrong length"),
err,
)
}
}
impl<I: Stream, E> StreamExt<E> for I {}
impl<D: ?Sized + Deserializer> Stream for &mut D {
fn iread_n<A, E>(
self,
n: usize,
ok: impl FnOnce(&[u8]) -> A,
err: impl FnOnce(&[u8]) -> E,
) -> Result<(A, Self), E> {
let slice = self.read_n(n);
if slice.len() == n {
Ok((ok(slice), self))
} else {
Err(err(slice))
}
}
fn iread_all<A>(self, ok: impl FnOnce(&[u8]) -> A) -> A {
ok(self.read_all())
}
fn itell(&self) -> usize {
self.tell()
}
}
pub trait StreamResultExt<A, E> {
fn seal(self) -> Result<A, E>;
}
impl<A, E, I: Stream> StreamResultExt<A, E> for Result<(A, I), E> {
fn seal(self) -> Result<A, E> {
self.map(|(a, _)| a)
}
}
pub trait FromRef<T: ?Sized>: for<'a> From<&'a T> {
fn from_ref(value: &T) -> Self {
Self::from(value)
}
}
impl<T: ?Sized, U: for<'a> From<&'a T>> FromRef<T> for U {}