Mode::x methods

This commit is contained in:
AF 2023-07-29 18:53:13 +00:00
parent 3bbcfadec7
commit ecdefe53cd
2 changed files with 38 additions and 0 deletions

View File

@ -18,6 +18,16 @@ pub trait Mode {
) -> Self::ParseResult<A1, E, I>; ) -> Self::ParseResult<A1, E, I>;
fn seal<A, E, I>(result: Self::ParseResult<A, E, I>) -> Result<A, E>; fn seal<A, E, I>(result: Self::ParseResult<A, E, I>) -> Result<A, E>;
fn xmap_err<A, E0, E1>(
result: Self::ExtensionResult<A, E0>,
f: impl FnOnce(E0) -> E1,
) -> Self::ExtensionResult<A, E1>;
fn xbind<A0, A1, E>(
result: Self::ExtensionResult<A0, E>,
f: impl FnOnce(A0) -> Result<A1, E>,
) -> Self::ExtensionResult<A1, E>;
} }
pub trait ParseMode { pub trait ParseMode {
@ -89,6 +99,20 @@ impl Mode for RegularMode {
fn seal<A, E, I>(result: Self::ParseResult<A, E, I>) -> Result<A, E> { fn seal<A, E, I>(result: Self::ParseResult<A, E, I>) -> Result<A, E> {
result result
} }
fn xmap_err<A, E0, E1>(
result: Self::ExtensionResult<A, E0>,
f: impl FnOnce(E0) -> E1,
) -> Self::ExtensionResult<A, E1> {
result.map_err(f)
}
fn xbind<A0, A1, E>(
result: Self::ExtensionResult<A0, E>,
f: impl FnOnce(A0) -> Result<A1, E>,
) -> Self::ExtensionResult<A1, E> {
result.and_then(f)
}
} }
pub trait RegularFactory<'a, Ctx: Context<'a>>: pub trait RegularFactory<'a, Ctx: Context<'a>>:

View File

@ -26,6 +26,20 @@ impl Mode for InliningMode {
fn seal<A, E, I>(result: Self::ParseResult<A, E, I>) -> Result<A, E> { fn seal<A, E, I>(result: Self::ParseResult<A, E, I>) -> Result<A, E> {
result.map(|(a, _)| a) result.map(|(a, _)| a)
} }
fn xmap_err<A, E0, E1>(
result: Self::ExtensionResult<A, E0>,
f: impl FnOnce(E0) -> E1,
) -> Self::ExtensionResult<A, E1> {
f(result)
}
fn xbind<A0, A1, E>(
result: Self::ExtensionResult<A0, E>,
_f: impl FnOnce(A0) -> Result<A1, E>,
) -> Self::ExtensionResult<A1, E> {
result
}
} }
impl<'a, Ctx: Context<'a>, F: InlineableFactory<'a, Ctx>> FactoryProxy<'a, Ctx> impl<'a, Ctx: Context<'a>, F: InlineableFactory<'a, Ctx>> FactoryProxy<'a, Ctx>