Ergo.Context.update_tracks

You're seeing just the function update_tracks, go back to Ergo.Context module for more information.
Link to this function

update_tracks(ctx, ref, description)

We track which parsers have operated on the input.

Examples

First example checks that we keep references
iex> alias Ergo.Context
iex> import Ergo.{Terminals, Combinators}
iex> context = Context.new("Hello World")
iex> parser = many(char(?H))
iex> track = {parser.ref, parser.description, 0, 1, 1}
iex> assert %Context{tracks: [^track]} = context2 = Context.update_tracks(context, parser.ref, parser.description)
iex> parser2 = many(char(?e))
iex> track2 = {parser2.ref, parser2.description, 0, 1, 1}
iex> assert %Context{tracks: [^track2, ^track]} = Context.update_tracks(context2, parser2.ref, parser2.description)

Second example checks that we throw if we get a cycle
iex> import Ergo.{Terminals, Combinators}
iex> parser = many(choice([many(ws()), char(?})]))
iex> assert_raise Ergo.Context.CycleError, fn -> Ergo.parse(parser, "}}}") end