diff --git a/src/mode.rs b/src/mode.rs index de00386..008db44 100644 --- a/src/mode.rs +++ b/src/mode.rs @@ -121,3 +121,73 @@ pub type ExtensionSourceP = ExtensionSource<::Mode, A>; /// [`ParseMode`] equivalent of [`ModeResult`]. pub type ModeResultP = ModeResult<::Mode, A, E, I>; + +/// Extension trait for all [`ParseMode`] types, re-exporting [`Mode`] traits. +pub trait ParseModeExt: ParseMode { + /// [`Mode::bind`]. + fn bind( + s: ParseSuccessP, + f: impl FnOnce(A0) -> Result, + ) -> ModeResultP { + ::bind(s, f) + } + + /// [`Mode::map`]. + fn map( + s: ParseSuccessP, + f: impl FnOnce(A0) -> A1, + ) -> ParseSuccessP { + ::map(s, f) + } + + /// [`Mode::seal`]. + fn seal(s: ParseSuccessP) -> A { + ::seal(s) + } + + /// [`Mode::xmap_err`]. + fn xmap_err( + result: ExtensionResultP, + f: impl FnOnce(E0) -> E1, + ) -> ExtensionResultP { + ::xmap_err(result, f) + } + + /// [`Mode::xbind`]. + fn xbind( + result: ExtensionResultP, + f: impl FnOnce(A0) -> Result, + ) -> ExtensionResultP { + ::xbind(result, f) + } + + /// [`Mode::xseal`]. + fn xseal(result: ExtensionResultP) -> Result { + ::xseal(result) + } + + /// [`Mode::smap`]. + fn smap( + source: ExtensionSourceP, + f: impl FnOnce(A0) -> A1, + ) -> ExtensionSourceP { + ::smap(source, f) + } + + /// [`Mode::prepare`]. + fn prepare(a: A) -> ExtensionSourceP { + ::prepare(a) + } + + /// [`Mode::xsbind`]. + fn xsbind( + ab: ExtensionSourceP, + t2ab: impl FnOnce(AB) -> (A, B), + ce: impl FnOnce(ExtensionSourceP) -> ExtensionResultP, + ab2t: impl FnOnce(A, B) -> Result, + ) -> ExtensionResultP { + ::xsbind(ab, t2ab, ce, ab2t) + } +} + +impl ParseModeExt for F {} diff --git a/src/rcore.rs b/src/rcore.rs index 0f84819..8201285 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, - ImplMode, ModeResultM, ParseModeExt, RegularFactory, RegularMode, WithMode, WithParseMode, + ImplMode, ModeResultM, 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 8af6f44..6f0ad1f 100644 --- a/src/rcore/modes.rs +++ b/src/rcore/modes.rs @@ -2,76 +2,6 @@ use std::marker::PhantomData; use super::*; -/// Extension trait for all [`ParseMode`] types, re-exporting [`Mode`] traits. -pub trait ParseModeExt: ParseMode { - /// [`Mode::bind`]. - fn bind( - s: ParseSuccessP, - f: impl FnOnce(A0) -> Result, - ) -> ModeResultP { - ::bind(s, f) - } - - /// [`Mode::map`]. - fn map( - s: ParseSuccessP, - f: impl FnOnce(A0) -> A1, - ) -> ParseSuccessP { - ::map(s, f) - } - - /// [`Mode::seal`]. - fn seal(s: ParseSuccessP) -> A { - ::seal(s) - } - - /// [`Mode::xmap_err`]. - fn xmap_err( - result: ExtensionResultP, - f: impl FnOnce(E0) -> E1, - ) -> ExtensionResultP { - ::xmap_err(result, f) - } - - /// [`Mode::xbind`]. - fn xbind( - result: ExtensionResultP, - f: impl FnOnce(A0) -> Result, - ) -> ExtensionResultP { - ::xbind(result, f) - } - - /// [`Mode::xseal`]. - fn xseal(result: ExtensionResultP) -> Result { - ::xseal(result) - } - - /// [`Mode::smap`]. - fn smap( - source: ExtensionSourceP, - f: impl FnOnce(A0) -> A1, - ) -> ExtensionSourceP { - ::smap(source, f) - } - - /// [`Mode::prepare`]. - fn prepare(a: A) -> ExtensionSourceP { - ::prepare(a) - } - - /// [`Mode::xsbind`]. - fn xsbind( - ab: ExtensionSourceP, - t2ab: impl FnOnce(AB) -> (A, B), - ce: impl FnOnce(ExtensionSourceP) -> ExtensionResultP, - ab2t: impl FnOnce(A, B) -> Result, - ) -> ExtensionResultP { - ::xsbind(ab, t2ab, ce, ab2t) - } -} - -impl ParseModeExt for F {} - /// For auto-implementing [`FactoryParse`] and [`Atomic`]. /// /// [`Atomic`]: crate::rstd::atomic::Atomic