From 138f6f2d2475f97856f638deb9d38ac0d298aa33 Mon Sep 17 00:00:00 2001 From: timofey Date: Sun, 30 Jul 2023 19:09:51 +0000 Subject: [PATCH] `mode::regular` --- src/mode.rs | 5 ++- src/mode/regular.rs | 75 +++++++++++++++++++++++++++++++++++++++++++++ src/rcore.rs | 2 +- src/rcore/modes.rs | 71 ------------------------------------------ 4 files changed, 80 insertions(+), 73 deletions(-) create mode 100644 src/mode/regular.rs diff --git a/src/mode.rs b/src/mode.rs index 15247c4..4c6fb23 100644 --- a/src/mode.rs +++ b/src/mode.rs @@ -1,5 +1,9 @@ +mod regular; + use std::marker::PhantomData; +pub use self::regular::RegularMode; + /// See [`ModeResult`]. pub type ParseSuccess = ::ParseSuccess; @@ -23,7 +27,6 @@ pub type ModeResult = Result, E>; /// | [`RegularMode`] | `A` | [`Result`] | `A` | /// | [`InliningMode`] | [`(A, I)`] | `E` | [`()`] | /// -/// [`RegularMode`]: crate::rcore::RegularMode /// [`InliningMode`]: crate::rstd::inlining::InliningMode /// [`(A, I)`]: tuple /// [`()`]: unit diff --git a/src/mode/regular.rs b/src/mode/regular.rs new file mode 100644 index 0000000..4d242d1 --- /dev/null +++ b/src/mode/regular.rs @@ -0,0 +1,75 @@ +use super::*; + +/// [`Mode`] for [`RegularFactory`] and [`RegularAtomic`]. +/// +/// [`RegularFactory`]: crate::rcore::RegularFactory +/// [`RegularAtomic`]: crate::rstd::atomic::RegularAtomic +pub struct RegularMode; + +impl Mode for RegularMode { + /// Discards the parser. + type ParseSuccess = A; + + /// Tries to extend the value. + type ExtensionResult = Result; + + /// Keeps the value. + type ExtensionSource = A; + + fn bind( + s: Self::ParseSuccess, + f: impl FnOnce(A0) -> Result, + ) -> ModeResult { + f(s) + } + + fn map( + s: Self::ParseSuccess, + f: impl FnOnce(A0) -> A1, + ) -> Self::ParseSuccess { + f(s) + } + + fn seal(s: Self::ParseSuccess) -> A { + s + } + + fn xmap_err( + result: Self::ExtensionResult, + f: impl FnOnce(E0) -> E1, + ) -> Self::ExtensionResult { + result.map_err(f) + } + + fn xbind( + result: Self::ExtensionResult, + f: impl FnOnce(A0) -> Result, + ) -> Self::ExtensionResult { + result.and_then(f) + } + + fn xseal(result: Self::ExtensionResult) -> Result { + result + } + + fn smap( + source: Self::ExtensionSource, + f: impl FnOnce(A0) -> A1, + ) -> Self::ExtensionSource { + f(source) + } + + fn prepare(a: A) -> Self::ExtensionSource { + a + } + + 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 { + let (b, c) = t2ab(ab); + ab2t(b, ce(c)?) + } +} diff --git a/src/rcore.rs b/src/rcore.rs index 45bea6b..4af7999 100644 --- a/src/rcore.rs +++ b/src/rcore.rs @@ -35,7 +35,7 @@ pub use self::inctx::InCtx; pub use self::inlining::{Inlining, InliningExt, InliningResultExt}; pub use self::modes::{ CRegularFactory, ExtensionResultM, ExtensionSourceM, FactoryModeParse, FactoryModeProxy, - ModeResultM, RegularFactory, RegularMode, + ModeResultM, RegularFactory, }; pub use self::origin::{OFctr, Origin}; pub use self::point::Point; diff --git a/src/rcore/modes.rs b/src/rcore/modes.rs index c74c7d6..7a5c8aa 100644 --- a/src/rcore/modes.rs +++ b/src/rcore/modes.rs @@ -73,77 +73,6 @@ where } } -/// [`Mode`] for [`RegularFactory`]. -pub struct RegularMode; - -impl Mode for RegularMode { - /// Discards the parser. - type ParseSuccess = A; - - /// Tries to extend the value. - type ExtensionResult = Result; - - /// Keeps the value. - type ExtensionSource = A; - - fn bind( - s: Self::ParseSuccess, - f: impl FnOnce(A0) -> Result, - ) -> ModeResult { - f(s) - } - - fn map( - s: Self::ParseSuccess, - f: impl FnOnce(A0) -> A1, - ) -> Self::ParseSuccess { - f(s) - } - - fn seal(s: Self::ParseSuccess) -> A { - s - } - - fn xmap_err( - result: Self::ExtensionResult, - f: impl FnOnce(E0) -> E1, - ) -> Self::ExtensionResult { - result.map_err(f) - } - - fn xbind( - result: Self::ExtensionResult, - f: impl FnOnce(A0) -> Result, - ) -> Self::ExtensionResult { - result.and_then(f) - } - - fn xseal(result: Self::ExtensionResult) -> Result { - result - } - - fn smap( - source: Self::ExtensionSource, - f: impl FnOnce(A0) -> A1, - ) -> Self::ExtensionSource { - f(source) - } - - fn prepare(a: A) -> Self::ExtensionSource { - a - } - - 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 { - let (b, c) = t2ab(ab); - ab2t(b, ce(c)?) - } -} - /// For auto-deriving [`RegularFactory`] from concrete implementations. pub trait CRegularFactory<'a, Ctx: Context<'a>>: FactoryBase<'a, Ctx> + ImplMode