From 25fe0655dc4595171d977bcf326f2ab593f3d235 Mon Sep 17 00:00:00 2001 From: timofey Date: Sun, 30 Jul 2023 23:03:36 +0000 Subject: [PATCH] `StackNodeFactory` via `FactoryModeParse` --- src/rstd/collections/stack.rs | 53 +++++++++++++++-------------------- 1 file changed, 22 insertions(+), 31 deletions(-) diff --git a/src/rstd/collections/stack.rs b/src/rstd/collections/stack.rs index e3494ce..2a00bb3 100644 --- a/src/rstd/collections/stack.rs +++ b/src/rstd/collections/stack.rs @@ -103,49 +103,40 @@ impl<'a, Ctx: Context<'a>, F: FactoryBase<'a, Ctx>> FactoryBase<'a, Ctx> for Sta type ParseError = StackParseError>; } -impl ImplMode for StackNodeFactory { +impl ParseMode for StackNodeFactory { type Mode = F::Mode; } -impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx> + RegularFactory<'a, Ctx>> CRegularFactory<'a, Ctx> +impl<'a, Ctx: Context<'a>, F: FactoryModeParse<'a, Ctx>> FactoryModeParse<'a, Ctx> for StackNodeFactory where F::Mtbl: MentionableTop<'a, Ctx>, { - fn crdeserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { + fn mdeserialize>(&self, inctx: I) -> ModeResultM<'a, Ctx, Self, I> { let (rest, inctx) = self.parse_point(inctx)?; - let element = self + let selement = self .element_factory - .rdeserialize(inctx) + .mdeserialize(inctx) .map_err(StackParseError::Element)?; - Ok(StackNode { rest, element }) + Ok(Self::map(selement, |element| StackNode { rest, element })) } - fn crextend(&self, mut mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self> { - mentionable.element = self - .element_factory - .rextend(mentionable.element, tail) - .map_err(StackParseError::Element)?; - Ok(mentionable) - } -} - -impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx> + InliningFactory<'a, Ctx>> CInliningFactory<'a, Ctx> - for StackNodeFactory -where - F::Mtbl: MentionableTop<'a, Ctx>, -{ - fn cextension_error(&self, tail: &[u8]) -> Self::ParseError { - StackParseError::Element(self.element_factory.extension_error(tail)) - } - - fn cideserialize>(&self, inctx: I) -> IParseResult<'a, Ctx, Self, I> { - let (rest, inctx) = self.parse_point(inctx)?; - let (element, inctx) = self - .element_factory - .ideserialize(inctx) - .map_err(StackParseError::Element)?; - Ok((StackNode { rest, element }, inctx)) + fn mextend( + &self, + mentionable: ExtensionSourceM<'a, Ctx, Self>, + tail: &[u8], + ) -> ExtensionResultM<'a, Ctx, Self> { + Self::xsbind( + mentionable, + |StackNode { rest, element }| (rest, element), + |element| { + Self::xmap_err( + self.element_factory.mextend(element, tail), + StackParseError::Element, + ) + }, + |rest, element| Ok(StackNode { rest, element }), + ) } }