This class is used to index registers within the mutable state.
Attributes
- Since
-
2.2.0
- Note
-
it is undefined behaviour to use a register in multiple different independent parsers. You should be careful to parameterise the registers in shared parsers and allocate fresh ones for each "top-level" parser you will run.
- Companion
- object
- Source
- registers.scala
- Graph
-
- Supertypes
Members list
Grouped members
Getters
These combinators allow for the retrieval of the stateful value of a register, and injecting it into the parsing context. Does not modify the contents of the register itself.
This combinator injects the value stored in this register into a parser.
This combinator injects the value stored in this register into a parser.
Allows for the value stored in this register to be purely injected into the parsing context. No input is consumed in this process, and it cannot fail.
Attributes
- Returns
-
a parser that returns the value stored in this register.
- Since
-
3.2.0
- Example
-
Get-Get Law:
r.get *> r.get == r.get r.get <~> r.get == r.get.map(x => (x, x))
- Source
- registers.scala
This combinator injects the value stored in this register into a parser after applying a function to it.
This combinator injects the value stored in this register into a parser after applying a function to it.
Allows for the value stored in this register to be purely injected into the parsing context but the function f
is applied first. No input is consumed in this process, and it cannot fail.
Type parameters
- B
-
the desired result type.
Value parameters
- f
-
the function used to transform the value in this register.
Attributes
- Returns
-
the value stored in this register applied to
f
. - Since
-
3.2.0
- Source
- registers.scala
This combinator injects the value stored in this register into a parser after applying a function obtained from a parser to it.
This combinator injects the value stored in this register into a parser after applying a function obtained from a parser to it.
First, pf
is parsed, producing the function f
on success. Then, the value stored in this register x
is applied to the function f
. The combinator returns f(x)
. Only pf
is allowed to consume input. If pf
fails, the combinator fails, otherwise it will succeed.
Type parameters
- B
-
the desired result type.
Value parameters
- pf
-
the parser that produces the function used to transform the value in this register.
Attributes
- Returns
-
the value stored in this register applied to a function generated from
pf
. - Since
-
3.2.0
- Source
- registers.scala
Setters
These combinators directly update the value contained within a register. This new value can be provided directly or sourced from a parser.
This combinator stores a new value into this register.
This combinator stores a new value into this register.
Without any other effect, the value x
will be placed into this register.
Value parameters
- x
-
the value to place in the register.
Attributes
- Since
-
3.2.0
- Example
-
Put-Get Law:
r.put(x) *> r.get == r.put(x).as(x)
Put-Put Law:
r.put(x) *> r.put(y) == r.put(y)
- Source
- registers.scala
This combinator stores a new value into this register.
This combinator stores a new value into this register.
First, parse p
to obtain its result x
. Then store x
into this register without any further effect. If p
fails this combinator fails.
Value parameters
- p
-
the parser that produces the value to store in the register.
Attributes
- Since
-
3.2.0
- Example
-
Get-Put Law:
r.put(r.get) == unit
Put-Put Law:
// only when `q` does not inspect the value of `r`! r.put(p) *> r.put(q) == p *> r.put(q)
- Source
- registers.scala
This combinator stores a new value into this register.
This combinator stores a new value into this register.
First, parse p
to obtain its result x
. Then store f(x)
into this register without any further effect. If p
fails this combinator fails.
Equivalent to
this.put(p.map(f))
Value parameters
- f
-
a function which adapts the result of
p
so that it can fit into this register. - p
-
the parser that produces the value to store in the register.
Attributes
- Since
-
3.0.0
- Source
- registers.scala
Modification
These combinators modify the value stored within a register by using a function. The function used can be provided directly or sourced from a parser.
This combinator modifies the value stored in this register with a function.
This combinator modifies the value stored in this register with a function.
Without any other effect, get the value stored in this register, x
, and put back f(x)
.
Equivalent to
this.put(this.gets(f))
Value parameters
- f
-
the function used to modify this register's value.
Attributes
- Since
-
3.2.0
- Source
- registers.scala
This combinator modifies the value stored in this register with a function.
This combinator modifies the value stored in this register with a function.
First, parse pf
to obtain its result f
. Then get the value stored in this register, x
, and put back f(x)
. If p
fails this combinator fails.
Equivalent to
this.put(this.gets(pf))
Value parameters
- pf
-
the parser that produces the function used to transform the value in this register.
Attributes
- Since
-
3.2.0
- Source
- registers.scala
Local Modification
These combinators allow for some form of local stateful modification. This means that any changes to the register may be reverted after the execution of the parser: this may be on the parsers success, but it could also involve the parsers failure.
This combinator changed the value stored in this register for the duration of a given parser, resetting it afterwards.
This combinator changed the value stored in this register for the duration of a given parser, resetting it afterwards.
First get the current value in this register xold
, then place x
into this register without any further effect. Then, parse p
, producing result y
on success. Finally, put xold
back into this register and return y
. If p
fails, the whole combinator fails and the state is not restored.
Value parameters
- p
-
the parser to execute with the adjusted state.
- x
-
the value to place into this register.
Attributes
- Returns
-
the parser that performs
p
with the modified statex
. - Since
-
3.2.0
- Example
-
Put-Put Law:
r.put(x) *> r.local(y)(p) == r.put(y) *> p <* r.put(x)
- Source
- registers.scala
This combinator changed the value stored in this register for the duration of a given parser, resetting it afterwards.
This combinator changed the value stored in this register for the duration of a given parser, resetting it afterwards.
First get the current value in this register xold
, then parse p
to get the result x
, placing it into this register without any further effect. Then, parse q
, producing result y
on success. Finally, put xold
back into this register and return y
. If p
or q
fail, the whole combinator fails and the state is not restored.
Value parameters
- p
-
the parser whose return value is placed in this register.
- q
-
the parser to execute with the adjusted state.
Attributes
- Returns
-
the parser that performs
q
with the modified state. - Since
-
3.2.0
- Source
- registers.scala
This combinator changed the value stored in this register for the duration of a given parser, resetting it afterwards.
This combinator changed the value stored in this register for the duration of a given parser, resetting it afterwards.
First get the current value in this register xold
, then place f(xold)
into this register without any further effect. Then, parse p
, producing result y
on success. Finally, put xold
back into this register and return y
. If p
fails, the whole combinator fails and the state is not restored.
Value parameters
- f
-
the function used to modify the value in this register.
- p
-
the parser to execute with the adjusted state.
Attributes
- Returns
-
the parser that performs
p
with the modified state. - Since
-
3.2.0
- Example
-
Put-Put Law and Put-Get Law:
r.put(x) *> r.local(f)(p) == r.put(f(x)) *> p <* r.put(x)
- Source
- registers.scala
This combinator rolls-back any changes to this register made by a given parser if it fails.
This combinator rolls-back any changes to this register made by a given parser if it fails.
First get the current value in this register xold
. Then parse p
, if it succeeds, producing y
, then y
is returned and this register retains its value post-p
. Otherwise, if p
failed without consuming input, xold
is placed back into this register and this combinator fails.
This can be used in conjunction with local to make an almost unconditional state restore:
// `r`'s state is always rolled back after `p` unless it fails having consumed input.
r.rollback(r.local(x)(p))
Value parameters
- p
-
the parser to perform.
Attributes
- Returns
-
the result of the parser
p
, if any. - Since
-
3.2.0
- Source
- registers.scala