use super::*;
impl<A: AtomicModeParse> Atomic for A {
fn a_deserialize(stream: impl Stream) -> AParseResult<Self> {
Self::ma_deserialize(stream).map(Self::seal)
}
fn a_extend(self, tail: &[u8]) -> AParseResult<Self> {
Self::xseal(Self::ma_extend(Self::prepare(self), tail))
}
}
pub type AModeResultM<A, I> = ModeResultP<A, A, AParseError<A>, I>;
pub type AExtensionResultM<A> = ExtensionResultP<A, A, AParseError<A>>;
pub type AExtensionSourceM<A> = ExtensionSourceP<A, A>;
pub trait AtomicModeParse: AtomicBase + ParseMode {
fn ma_deserialize<I: Stream>(stream: I) -> AModeResultM<Self, I>;
fn ma_extend(atomic: AExtensionSourceM<Self>, tail: &[u8]) -> AExtensionResultM<Self>;
}
pub trait AtomicModeProxy {
type A: AtomicBase + ParseMode;
fn pma_deserialize<I: Stream>(stream: I) -> AModeResultM<Self::A, I>;
fn pma_extend(atomic: AExtensionSourceM<Self::A>, tail: &[u8]) -> AExtensionResultM<Self::A>;
}
impl<A: AtomicBase + WithParseMode> AtomicModeParse for A
where
<A as WithParseMode>::WithMode: AtomicModeProxy<A = A>,
{
fn ma_deserialize<I: Stream>(stream: I) -> AModeResultM<Self, I> {
<<A as WithParseMode>::WithMode as AtomicModeProxy>::pma_deserialize(stream)
}
fn ma_extend(atomic: AExtensionSourceM<Self>, tail: &[u8]) -> AExtensionResultM<Self> {
<<A as WithParseMode>::WithMode as AtomicModeProxy>::pma_extend(atomic, tail)
}
}