Mode
This commit is contained in:
parent
b7e3beacb6
commit
5dff836c58
@ -33,7 +33,7 @@ pub use self::hashing::{Hash, HASH_SIZE, HASH_ZEROS};
|
|||||||
pub use self::inctx::InCtx;
|
pub use self::inctx::InCtx;
|
||||||
pub use self::inlining::{Inlining, InliningExt, InliningResultExt};
|
pub use self::inlining::{Inlining, InliningExt, InliningResultExt};
|
||||||
pub use self::modes::{
|
pub use self::modes::{
|
||||||
FactoryProxy, ParseMode, RegularFactory, RegularMode, WithMode, WithParseMode,
|
FactoryProxy, Mode, ParseMode, RegularFactory, RegularMode, WithMode, WithParseMode,
|
||||||
};
|
};
|
||||||
pub use self::origin::{OFctr, Origin};
|
pub use self::origin::{OFctr, Origin};
|
||||||
pub use self::point::Point;
|
pub use self::point::Point;
|
||||||
|
@ -2,8 +2,22 @@ use std::marker::PhantomData;
|
|||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
pub trait Mode {
|
||||||
|
type ParseResult<A, E, I>;
|
||||||
|
|
||||||
|
fn map_err<A, E0, E1, I>(
|
||||||
|
result: Self::ParseResult<A, E0, I>,
|
||||||
|
f: impl FnOnce(E0) -> E1,
|
||||||
|
) -> Self::ParseResult<A, E1, I>;
|
||||||
|
|
||||||
|
fn bind<A0, A1, E, I>(
|
||||||
|
result: Self::ParseResult<A0, E, I>,
|
||||||
|
f: impl FnOnce(A0) -> Result<A1, E>,
|
||||||
|
) -> Self::ParseResult<A1, E, I>;
|
||||||
|
}
|
||||||
|
|
||||||
pub trait ParseMode {
|
pub trait ParseMode {
|
||||||
type Mode: ?Sized;
|
type Mode: ?Sized + Mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait WithParseMode: ParseMode {
|
pub trait WithParseMode: ParseMode {
|
||||||
@ -49,6 +63,24 @@ where
|
|||||||
|
|
||||||
pub struct RegularMode;
|
pub struct RegularMode;
|
||||||
|
|
||||||
|
impl Mode for RegularMode {
|
||||||
|
type ParseResult<A, E, I> = Result<A, E>;
|
||||||
|
|
||||||
|
fn map_err<A, E0, E1, I>(
|
||||||
|
result: Self::ParseResult<A, E0, I>,
|
||||||
|
f: impl FnOnce(E0) -> E1,
|
||||||
|
) -> Self::ParseResult<A, E1, I> {
|
||||||
|
result.map_err(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bind<A0, A1, E, I>(
|
||||||
|
result: Self::ParseResult<A0, E, I>,
|
||||||
|
f: impl FnOnce(A0) -> Result<A1, E>,
|
||||||
|
) -> Self::ParseResult<A1, E, I> {
|
||||||
|
result.and_then(f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub trait RegularFactory<'a, Ctx: Context<'a>>:
|
pub trait RegularFactory<'a, Ctx: Context<'a>>:
|
||||||
FactoryBase<'a, Ctx> + ParseMode<Mode = RegularMode>
|
FactoryBase<'a, Ctx> + ParseMode<Mode = RegularMode>
|
||||||
{
|
{
|
||||||
|
@ -2,6 +2,26 @@ use super::*;
|
|||||||
|
|
||||||
pub struct InliningMode;
|
pub struct InliningMode;
|
||||||
|
|
||||||
|
impl Mode for InliningMode {
|
||||||
|
type ParseResult<A, E, I> = Result<(A, I), E>;
|
||||||
|
|
||||||
|
fn map_err<A, E0, E1, I>(
|
||||||
|
result: Self::ParseResult<A, E0, I>,
|
||||||
|
f: impl FnOnce(E0) -> E1,
|
||||||
|
) -> Self::ParseResult<A, E1, I> {
|
||||||
|
result.map_err(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bind<A0, A1, E, I>(
|
||||||
|
result: Self::ParseResult<A0, E, I>,
|
||||||
|
f: impl FnOnce(A0) -> Result<A1, E>,
|
||||||
|
) -> Self::ParseResult<A1, E, I> {
|
||||||
|
let (a0, i) = result?;
|
||||||
|
let a1 = f(a0)?;
|
||||||
|
Ok((a1, i))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, F: InlineableFactory<'a, Ctx>> FactoryProxy<'a, Ctx>
|
impl<'a, Ctx: Context<'a>, F: InlineableFactory<'a, Ctx>> FactoryProxy<'a, Ctx>
|
||||||
for WithMode<F, InliningMode>
|
for WithMode<F, InliningMode>
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user