diff --git a/src/rcore.rs b/src/rcore.rs index 0cb9822..f928710 100644 --- a/src/rcore.rs +++ b/src/rcore.rs @@ -34,7 +34,7 @@ pub use self::inctx::InCtx; pub use self::inlining::{Inlining, InliningExt, InliningResultExt}; pub use self::modes::{ ExtensionResultM, ExtensionSourceM, FactoryModeParse, FactoryModeProxy, ImplMode, Mode, - ParseMode, ParseResultM, RegularFactory, RegularMode, WithMode, WithParseMode, + ParseMode, ParseResultM, QRegularFactory, RegularFactory, RegularMode, WithMode, WithParseMode, }; pub use self::origin::{OFctr, Origin}; pub use self::point::Point; diff --git a/src/rcore/modes.rs b/src/rcore/modes.rs index c0d0a8d..3fbfc38 100644 --- a/src/rcore/modes.rs +++ b/src/rcore/modes.rs @@ -32,6 +32,11 @@ pub trait Mode { ) -> Self::ExtensionResult; fn xseal(result: Self::ExtensionResult) -> Result; + + fn smap( + source: Self::ExtensionSource, + f: impl FnOnce(A0) -> A1, + ) -> Self::ExtensionSource; } pub trait ParseMode { @@ -66,7 +71,7 @@ impl<'a, Ctx: Context<'a>, F: FactoryModeParse<'a, Ctx>> FactoryParse<'a, Ctx> f } } -impl<'a, Ctx: Context<'a>, F: FactoryParse<'a, Ctx> + WithParseMode> Factory<'a, Ctx> for F +impl<'a, Ctx: Context<'a>, F: FactoryParse<'a, Ctx> + ParseMode> Factory<'a, Ctx> for F where F::Mtbl: MentionableTop<'a, Ctx>, { @@ -174,6 +179,20 @@ impl Mode for RegularMode { fn xseal(result: Self::ExtensionResult) -> Result { result } + + fn smap( + source: Self::ExtensionSource, + f: impl FnOnce(A0) -> A1, + ) -> Self::ExtensionSource { + f(source) + } +} + +pub trait QRegularFactory<'a, Ctx: Context<'a>>: + FactoryBase<'a, Ctx> + ImplMode +{ + fn qrdeserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self>; + fn qrextend(&self, mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self>; } pub trait RegularFactory<'a, Ctx: Context<'a>>: @@ -183,17 +202,29 @@ pub trait RegularFactory<'a, Ctx: Context<'a>>: fn rextend(&self, mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self>; } -impl<'a, Ctx: Context<'a>, F: RegularFactory<'a, Ctx>> FactoryModeProxy<'a, Ctx> +impl<'a, Ctx: Context<'a>, F: FactoryModeParse<'a, Ctx> + ParseMode> + RegularFactory<'a, Ctx> for F +{ + fn rdeserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { + self.mdeserialize(inctx) + } + + fn rextend(&self, mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self> { + self.mextend(mentionable, tail) + } +} + +impl<'a, Ctx: Context<'a>, F: QRegularFactory<'a, Ctx>> FactoryModeProxy<'a, Ctx> for WithMode { type F = F; fn pmdeserialize>(f: &Self::F, inctx: I) -> ParseResultM<'a, Ctx, F, I> { - f.rdeserialize(inctx) + f.qrdeserialize(inctx) } fn pmextend(f: &F, mentionable: Mtbl<'a, Ctx, F>, tail: &[u8]) -> ExtensionResultM<'a, Ctx, F> { - f.rextend(mentionable, tail) + f.qrextend(mentionable, tail) } fn pmprepare(mentionable: Mtbl<'a, Ctx, Self::F>) -> ExtensionSourceM<'a, Ctx, Self::F> { diff --git a/src/rstd/atomic/atomic_object.rs b/src/rstd/atomic/atomic_object.rs index c02f303..906b9d1 100644 --- a/src/rstd/atomic/atomic_object.rs +++ b/src/rstd/atomic/atomic_object.rs @@ -75,17 +75,31 @@ impl<'a, Ctx: Context<'a>, A: AtomicBase> FactoryBase<'a, Ctx> for AtomicFactory type ParseError = A::AParseError; } -impl ImplMode for AtomicFactory { +impl ParseMode for AtomicFactory { type Mode = A::Mode; } -impl<'a, Ctx: Context<'a>, A: RegularAtomic> RegularFactory<'a, Ctx> for AtomicFactory { - fn rdeserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { - Ok(A::ra_deserialize(inctx)?.into()) +impl<'a, Ctx: Context<'a>, A: AtomicModeParse> FactoryModeParse<'a, Ctx> for AtomicFactory { + fn mdeserialize>(&self, inctx: I) -> ParseResultM<'a, Ctx, Self, I> { + <::Mode as Mode>::bind(A::ma_deserialize(inctx), |a| Ok(a.into())) } - fn rextend(&self, mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self> { - Ok(A::ra_extend(mentionable.atomic, tail)?.into()) + fn mextend( + &self, + mentionable: ExtensionSourceM<'a, Ctx, Self>, + tail: &[u8], + ) -> ExtensionResultM<'a, Ctx, Self> { + <::Mode as Mode>::xbind( + A::ma_extend( + <::Mode as Mode>::smap(mentionable, |a| a.atomic), + tail, + ), + |a| Ok(a.into()), + ) + } + + fn mprepare(mentionable: Self::Mtbl) -> ExtensionSourceM<'a, Ctx, Self> { + <::Mode as Mode>::smap(mentionable.atomic.ma_prepare(), |a| a.into()) } } diff --git a/src/rstd/collections/stack.rs b/src/rstd/collections/stack.rs index 9fc1f70..fce68fc 100644 --- a/src/rstd/collections/stack.rs +++ b/src/rstd/collections/stack.rs @@ -106,12 +106,12 @@ impl ImplMode for StackNodeFactory { type Mode = F::Mode; } -impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx> + RegularFactory<'a, Ctx>> RegularFactory<'a, Ctx> +impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx> + RegularFactory<'a, Ctx>> QRegularFactory<'a, Ctx> for StackNodeFactory where F::Mtbl: MentionableTop<'a, Ctx>, { - fn rdeserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { + fn qrdeserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { let (rest, inctx) = self.parse_point(inctx)?; let element = self .element_factory @@ -120,7 +120,7 @@ where Ok(StackNode { rest, element }) } - fn rextend(&self, mut mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self> { + fn qrextend(&self, mut mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self> { mentionable.element = self .element_factory .extend(mentionable.element, tail) @@ -182,8 +182,8 @@ where } } -impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx> + Mentionable<'a, Ctx> + Clone> - ExtStackClone<'a, Ctx, A> for Stack<'a, Ctx, A> +impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx> + Clone> ExtStackClone<'a, Ctx, A> + for Stack<'a, Ctx, A> where StackNode<'a, Ctx, A>: Mentionable<'a, Ctx, _Fctr = StackNodeFactory>, StackNodeFactory: FactoryParse<'a, Ctx>, diff --git a/src/rstd/collections/tree.rs b/src/rstd/collections/tree.rs index 423599c..4f928ce 100644 --- a/src/rstd/collections/tree.rs +++ b/src/rstd/collections/tree.rs @@ -144,8 +144,8 @@ impl ImplMode for NodeFactory { type Mode = RegularMode; } -impl<'a, Ctx: Context<'a>, F: FactoryParse<'a, Ctx>> RegularFactory<'a, Ctx> for NodeFactory { - fn rdeserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { +impl<'a, Ctx: Context<'a>, F: FactoryParse<'a, Ctx>> QRegularFactory<'a, Ctx> for NodeFactory { + fn qrdeserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { let tree_factory = TreeFactory(NullableFactory::new(self.clone())); let (l, inctx) = tree_factory.ideserialize(inctx)?; let (r, inctx) = tree_factory.ideserialize(inctx)?; @@ -153,7 +153,7 @@ impl<'a, Ctx: Context<'a>, F: FactoryParse<'a, Ctx>> RegularFactory<'a, Ctx> for Ok(Node { l, r, key }) } - fn rextend(&self, mut mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self> { + fn qrextend(&self, mut mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self> { mentionable.key = self .0 .extend(mentionable.key, tail) diff --git a/src/rstd/inlining/modes.rs b/src/rstd/inlining/modes.rs index 234ef5d..66c1bfe 100644 --- a/src/rstd/inlining/modes.rs +++ b/src/rstd/inlining/modes.rs @@ -46,6 +46,13 @@ impl Mode for InliningMode { fn xseal(result: Self::ExtensionResult) -> Result { Err(result) } + + fn smap( + source: Self::ExtensionSource, + _f: impl FnOnce(A0) -> A1, + ) -> Self::ExtensionSource { + source + } } impl<'a, Ctx: Context<'a>, F: InliningFactory<'a, Ctx>> FactoryModeProxy<'a, Ctx> diff --git a/src/rstd/inlining/static_pair.rs b/src/rstd/inlining/static_pair.rs index cd52efb..96ac0db 100644 --- a/src/rstd/inlining/static_pair.rs +++ b/src/rstd/inlining/static_pair.rs @@ -140,16 +140,16 @@ impl<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> FactoryBase<'a, Ctx> type ParseError = SP::ParseError; } -impl<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> ParseMode for StaticPairFactory<'a, Ctx, SP> { +impl<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> ImplMode for StaticPairFactory<'a, Ctx, SP> { type Mode = ::Mode; } -impl<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> RegularFactory<'a, Ctx> +impl<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> QRegularFactory<'a, Ctx> for StaticPairFactory<'a, Ctx, SP> where SP::FB: RegularFactory<'a, Ctx>, { - fn rdeserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { + fn qrdeserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { let (fa, fb) = SP::factories(&self.factory_data); let (a, inctx) = fa .ideserialize(inctx) @@ -162,7 +162,7 @@ where }) } - fn rextend(&self, mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self> { + fn qrextend(&self, mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self> { let (_, fb) = SP::factories(&self.factory_data); let (a, b) = mentionable.pair.into_elements(); match fb.rextend(b, tail) { diff --git a/src/rstd/typeless.rs b/src/rstd/typeless.rs index f1727b4..1b08798 100644 --- a/src/rstd/typeless.rs +++ b/src/rstd/typeless.rs @@ -99,12 +99,12 @@ impl<'a, Ctx: Context<'a>> ImplMode for TypelessFactory<'a, Ctx> { type Mode = RegularMode; } -impl<'a, Ctx: Context<'a>> RegularFactory<'a, Ctx> for TypelessFactory<'a, Ctx> { - fn rdeserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { +impl<'a, Ctx: Context<'a>> QRegularFactory<'a, Ctx> for TypelessFactory<'a, Ctx> { + fn qrdeserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { self.t_deserialize.de(inctx.demote()).map_err(TypelessError) } - fn rextend(&self, mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self> { + fn qrextend(&self, mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self> { self.t_extend.xt(mentionable, tail) } }