NodeFactory via FactoryModeParse

This commit is contained in:
AF 2023-07-30 23:07:48 +00:00
parent 25fe0655dc
commit 7f1d72898d

View File

@ -142,25 +142,32 @@ impl<'a, Ctx: Context<'a>, F: FactoryBase<'a, Ctx>> FactoryBase<'a, Ctx> for Nod
type ParseError = TreeParseError<F::ParseError>; type ParseError = TreeParseError<F::ParseError>;
} }
impl<F> ImplMode for NodeFactory<F> { impl<F: ParseMode> ParseMode for NodeFactory<F> {
type Mode = RegularMode; type Mode = F::Mode;
} }
impl<'a, Ctx: Context<'a>, F: FactoryParse<'a, Ctx>> CRegularFactory<'a, Ctx> for NodeFactory<F> { impl<'a, Ctx: Context<'a>, F: FactoryModeParse<'a, Ctx>> FactoryModeParse<'a, Ctx>
fn crdeserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { for NodeFactory<F>
{
fn mdeserialize<I: InCtx<'a, Ctx>>(&self, inctx: I) -> ModeResultM<'a, Ctx, Self, I> {
let tree_factory = TreeFactory(NullableFactory::new(self.clone())); let tree_factory = TreeFactory(NullableFactory::new(self.clone()));
let (l, inctx) = tree_factory.ideserialize(inctx)?; let (l, inctx) = tree_factory.ideserialize(inctx)?;
let (r, inctx) = tree_factory.ideserialize(inctx)?; let (r, inctx) = tree_factory.ideserialize(inctx)?;
let key = self.0.deserialize(inctx).map_err(TreeParseError::Key)?; let skey = self.0.mdeserialize(inctx).map_err(TreeParseError::Key)?;
Ok(Node { l, r, key }) Ok(Self::map(skey, |key| Node { l, r, key }))
} }
fn crextend(&self, mut mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self> { fn mextend(
mentionable.key = self &self,
.0 mentionable: ExtensionSourceM<'a, Ctx, Self>,
.extend(mentionable.key, tail) tail: &[u8],
.map_err(TreeParseError::Key)?; ) -> ExtensionResultM<'a, Ctx, Self> {
Ok(mentionable) Self::xsbind(
mentionable,
|Node { l, r, key }| ((l, r), key),
|key| Self::xmap_err(self.0.mextend(key, tail), TreeParseError::Key),
|(l, r), key| Ok(Node { l, r, key }),
)
} }
} }