///|
/// A list under construction owns the buffer suffix starting at `start`.
/// Nested lists finish first; releasing a list restores its parent's suffix.
#valtype
priv struct PendingEdges {
  buffer : Array[Int]
  start : Int
}

///|
fn Parser::begin_edges(self : Parser) -> PendingEdges {
  { buffer: self.pending_edges, start: self.pending_edges.length(), }
}

///|
fn PendingEdges::push(self : PendingEdges, item : Int) -> Unit {
  self.buffer.push(item)
}

///|
fn PendingEdges::length(self : PendingEdges) -> Int {
  self.buffer.length() - self.start
}

///|
#alias("_[_]")
fn PendingEdges::at(self : PendingEdges, index : Int) -> Int {
  self.buffer[self.start + index]
}

///|
fn PendingEdges::view(self : PendingEdges) -> ArrayView[Int] {
  self.buffer[self.start:]
}

///|
fn PendingEdges::release(self : PendingEdges) -> Unit {
  self.buffer.truncate(self.start)
}