From 81904f1e1cac8d0a3e172721d06fd64bc47fe04b Mon Sep 17 00:00:00 2001 From: timofey Date: Sun, 30 Jul 2023 19:33:56 +0000 Subject: [PATCH] `mode::inlining` --- src/mode.rs | 3 +- src/mode/inlining.rs | 74 ++++++++++++++++++++++++++++++++++++++ src/rstd/inlining.rs | 2 -- src/rstd/inlining/modes.rs | 70 ------------------------------------ 4 files changed, 76 insertions(+), 73 deletions(-) create mode 100644 src/mode/inlining.rs diff --git a/src/mode.rs b/src/mode.rs index 3f37dc9..af48d66 100644 --- a/src/mode.rs +++ b/src/mode.rs @@ -1,3 +1,4 @@ +mod inlining; mod regular; mod serialization; mod slice_deserializer; @@ -5,6 +6,7 @@ mod stream; use std::marker::PhantomData; +pub use self::inlining::InliningMode; pub use self::regular::RegularMode; pub use self::serialization::{Deserializer, DeserializerExt, Serializable, Serializer}; pub use self::slice_deserializer::SliceDeserializer; @@ -33,7 +35,6 @@ pub type ModeResult = Result, E>; /// | [`RegularMode`] | `A` | [`Result`] | `A` | /// | [`InliningMode`] | [`(A, I)`] | `E` | [`()`] | /// -/// [`InliningMode`]: crate::rstd::inlining::InliningMode /// [`(A, I)`]: tuple /// [`()`]: unit pub trait Mode { diff --git a/src/mode/inlining.rs b/src/mode/inlining.rs new file mode 100644 index 0000000..4ce34b9 --- /dev/null +++ b/src/mode/inlining.rs @@ -0,0 +1,74 @@ +use super::*; + +/// [`Mode`] for [`InliningFactory`]. +/// +/// [`InliningFactory`]: crate::rstd::inlining::InliningFactory +/// [`InliningAtomic`]: crate::rstd::atomic::InliningAtomic +pub struct InliningMode; + +impl Mode for InliningMode { + /// Keeps the parser. + type ParseSuccess = (A, I); + + /// Always fails. + type ExtensionResult = E; + + /// Discards the value. + type ExtensionSource = (); + + fn bind( + s: Self::ParseSuccess, + f: impl FnOnce(A0) -> Result, + ) -> ModeResult { + let (a0, i) = s; + let a1 = f(a0)?; + Ok((a1, i)) + } + + fn map( + s: Self::ParseSuccess, + f: impl FnOnce(A0) -> A1, + ) -> Self::ParseSuccess { + (f(s.0), s.1) + } + + fn seal(s: Self::ParseSuccess) -> A { + s.0 + } + + fn xmap_err( + result: Self::ExtensionResult, + f: impl FnOnce(E0) -> E1, + ) -> Self::ExtensionResult { + f(result) + } + + fn xbind( + result: Self::ExtensionResult, + _f: impl FnOnce(A0) -> Result, + ) -> Self::ExtensionResult { + result + } + + fn xseal(result: Self::ExtensionResult) -> Result { + Err(result) + } + + fn smap( + source: Self::ExtensionSource, + _f: impl FnOnce(A0) -> A1, + ) -> Self::ExtensionSource { + source + } + + fn prepare(_a: A) -> Self::ExtensionSource {} + + fn xsbind( + _ab: Self::ExtensionSource, + _t2ab: impl FnOnce(AB) -> (A, B), + ce: impl FnOnce(Self::ExtensionSource) -> Self::ExtensionResult, + _ab2t: impl FnOnce(A, B) -> Result, + ) -> Self::ExtensionResult { + ce(()) + } +} diff --git a/src/rstd/inlining.rs b/src/rstd/inlining.rs index d9b9228..4ad52d4 100644 --- a/src/rstd/inlining.rs +++ b/src/rstd/inlining.rs @@ -11,8 +11,6 @@ use super::{ *, }; -pub use self::modes::InliningMode; - pub type IParseResult<'a, Ctx, F, I> = Result<(Mtbl<'a, Ctx, F>, I), ParseError<'a, Ctx, F>>; pub trait CInliningFactory<'a, Ctx: Context<'a>>: diff --git a/src/rstd/inlining/modes.rs b/src/rstd/inlining/modes.rs index c311d24..c62d1c3 100644 --- a/src/rstd/inlining/modes.rs +++ b/src/rstd/inlining/modes.rs @@ -2,76 +2,6 @@ use crate::mode::*; use super::*; -/// [`Mode`] for [`InliningFactory`]. -pub struct InliningMode; - -impl Mode for InliningMode { - /// Keeps the parser. - type ParseSuccess = (A, I); - - /// Always fails. - type ExtensionResult = E; - - /// Discards the value. - type ExtensionSource = (); - - fn bind( - s: Self::ParseSuccess, - f: impl FnOnce(A0) -> Result, - ) -> ModeResult { - let (a0, i) = s; - let a1 = f(a0)?; - Ok((a1, i)) - } - - fn map( - s: Self::ParseSuccess, - f: impl FnOnce(A0) -> A1, - ) -> Self::ParseSuccess { - (f(s.0), s.1) - } - - fn seal(s: Self::ParseSuccess) -> A { - s.0 - } - - fn xmap_err( - result: Self::ExtensionResult, - f: impl FnOnce(E0) -> E1, - ) -> Self::ExtensionResult { - f(result) - } - - fn xbind( - result: Self::ExtensionResult, - _f: impl FnOnce(A0) -> Result, - ) -> Self::ExtensionResult { - result - } - - fn xseal(result: Self::ExtensionResult) -> Result { - Err(result) - } - - fn smap( - source: Self::ExtensionSource, - _f: impl FnOnce(A0) -> A1, - ) -> Self::ExtensionSource { - source - } - - fn prepare(_a: A) -> Self::ExtensionSource {} - - fn xsbind( - _ab: Self::ExtensionSource, - _t2ab: impl FnOnce(AB) -> (A, B), - ce: impl FnOnce(Self::ExtensionSource) -> Self::ExtensionResult, - _ab2t: impl FnOnce(A, B) -> Result, - ) -> Self::ExtensionResult { - ce(()) - } -} - impl<'a, Ctx: Context<'a>, F: CInliningFactory<'a, Ctx>> FactoryModeProxy<'a, Ctx> for WithMode {