This commit is contained in:
AF 2023-10-13 11:52:50 +00:00
parent 9703a9fc33
commit 223c6205ac
2 changed files with 54 additions and 1 deletions

View File

@ -2,7 +2,7 @@
[Introduction](./ch00/s00-introduction.md)
- [Background]()
- [Mode Parsing](./ch01/s00-mode-parsing.md)
- [Implementation]()
- [Usage]()
- [Current Implementation Concerns](./ch04/s00-concerns.md)

View File

@ -0,0 +1,53 @@
# `Mode` Parsing
```rust
type ParseSuccess<M, A, I> = <M as Mode>::ParseSuccess<A, I>;
type ModeResult<M, A, E, I> = Result<ParseSuccess<M, A, I>, E>;
trait Mode {
type ParseSuccess<A, I>;
type ExtensionResult<A, E>;
type ExtensionSource<A>;
fn bind<A0, A1, E, I>(
s: Self::ParseSuccess<A0, I>,
f: impl FnOnce(A0) -> Result<A1, E>,
) -> ModeResult<Self, A1, E, I>;
fn map<A0, A1, I>(
s: Self::ParseSuccess<A0, I>,
f: impl FnOnce(A0) -> A1,
) -> Self::ParseSuccess<A1, I>;
fn seal<A, I>(s: Self::ParseSuccess<A, I>) -> A;
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>;
fn xseal<A, E>(result: Self::ExtensionResult<A, E>) -> Result<A, E>;
fn smap<A0, A1>(
source: Self::ExtensionSource<A0>,
f: impl FnOnce(A0) -> A1,
) -> Self::ExtensionSource<A1>;
fn prepare<A>(a: A) -> Self::ExtensionSource<A>;
fn xsbind<AB, A, B, E>(
ab: Self::ExtensionSource<AB>,
t2ab: impl FnOnce(AB) -> (A, B),
ce: impl FnOnce(Self::ExtensionSource<B>) -> Self::ExtensionResult<B, E>,
ab2t: impl FnOnce(A, B) -> Result<AB, E>,
) -> Self::ExtensionResult<AB, E>;
}
```