1///|
2pub fn[A, B] 
type Parser[A] (Input) -> (A, Input) raise ParseError
Parser
::
(x : Parser[A], f : (A) -> Parser[B]) -> Parser[B]
bind
(
Parser[A]
x
:
type Parser[A] (Input) -> (A, Input) raise ParseError
Parser
[

type parameter A

A
],
(A) -> Parser[B]
f
: (

type parameter A

A
) ->
type Parser[A] (Input) -> (A, Input) raise ParseError
Parser
[

type parameter B

B
]) ->
type Parser[A] (Input) -> (A, Input) raise ParseError
Parser
[

type parameter B

B
] {
3 fn(
Input
input
) {
4 let (
A
v
,
Input
rest
) =
Parser[A]
x
(
Input
input
)
5
(A) -> Parser[B]
f
(
A
v
)(
Input
rest
)
6 } 7} 8 9///| 10pub fn[A]
type Parser[A] (Input) -> (A, Input) raise ParseError
Parser
::
(x : A) -> Parser[A]
pure
(
A
x
:

type parameter A

A
) ->
type Parser[A] (Input) -> (A, Input) raise ParseError
Parser
[

type parameter A

A
] {
11 fn(
Input
input
) { (
A
x
,
Input
input
) }
12} 13 14///| 15pub fn[A, B]
type Parser[A] (Input) -> (A, Input) raise ParseError
Parser
::
(self : Parser[A], f : (A) -> B) -> Parser[B]
map
(
Parser[A]
self
:
type Parser[A] (Input) -> (A, Input) raise ParseError
Parser
[

type parameter A

A
],
(A) -> B
f
: (

type parameter A

A
) ->

type parameter B

B
) ->
type Parser[A] (Input) -> (A, Input) raise ParseError
Parser
[

type parameter B

B
] {
16
Parser[A]
self
.
(x : Parser[A], f : (A) -> Parser[B]) -> Parser[B]
bind
(
A
x
=>
(x : B) -> Parser[B]
pure
(
(A) -> B
f
(
A
x
)))
17} 18 19///| 20pub fn[A, B]
type Parser[A] (Input) -> (A, Input) raise ParseError
Parser
::
(self : Parser[A], f : (SourcePos, A) -> B) -> Parser[B]
map_srcpos
(
21
Parser[A]
self
:
type Parser[A] (Input) -> (A, Input) raise ParseError
Parser
[

type parameter A

A
],
22
(SourcePos, A) -> B
f
: (
struct SourcePos {
  row: Int
  col: Int
}
SourcePos
,

type parameter A

A
) ->

type parameter B

B
23) ->
type Parser[A] (Input) -> (A, Input) raise ParseError
Parser
[

type parameter B

B
] {
24 fn(
Input
input
) {
25 let {
Int
row
,
Int
col
, .. } =
Input
input
26 let (
A
x
,
Input
input
) =
Parser[A]
self
(
Input
input
)
27 (
(SourcePos, A) -> B
f
(
struct SourcePos {
  row: Int
  col: Int
}
SourcePos
::{
Int
row
,
Int
col
},
A
x
),
Input
input
)
28 } 29} 30 31///| 32pub fn[A, B]
type Parser[A] (Input) -> (A, Input) raise ParseError
Parser
::
(x : Parser[A], y : Parser[B]) -> Parser[B]
discard_left
(
Parser[A]
x
:
type Parser[A] (Input) -> (A, Input) raise ParseError
Parser
[

type parameter A

A
],
Parser[B]
y
:
type Parser[A] (Input) -> (A, Input) raise ParseError
Parser
[

type parameter B

B
]) ->
type Parser[A] (Input) -> (A, Input) raise ParseError
Parser
[

type parameter B

B
] {
33
Parser[A]
x
.
(x : Parser[A], f : (A) -> Parser[B]) -> Parser[B]
bind
(_ =>
Parser[B]
y
)
34} 35 36///| 37pub fn[A, B]
type Parser[A] (Input) -> (A, Input) raise ParseError
Parser
::
(x : Parser[A], y : Parser[B]) -> Parser[A]
discard_right
(
Parser[A]
x
:
type Parser[A] (Input) -> (A, Input) raise ParseError
Parser
[

type parameter A

A
],
Parser[B]
y
:
type Parser[A] (Input) -> (A, Input) raise ParseError
Parser
[

type parameter B

B
]) ->
type Parser[A] (Input) -> (A, Input) raise ParseError
Parser
[

type parameter A

A
] {
38
Parser[A]
x
.
(x : Parser[A], f : (A) -> Parser[A]) -> Parser[A]
bind
(
A
r
=>
Parser[B]
y
.
(x : Parser[B], f : (B) -> Parser[A]) -> Parser[A]
bind
(_ =>
(x : A) -> Parser[A]
pure
(
A
r
)))
39} 40