Statement iterator

class ref StatementIterator is Iterator[(Row val | FetchError)]
  """
  Iterator adapter for Statement. Enables `for result in stmt.values() do`.
  Yields Row values on success, FetchError on failure. EndOfRows ends
  iteration.
  """
  let _stmt: Statement ref
  var _next: (Row val | FetchError | None)
  var _done: Bool

  new ref create(stmt: Statement ref) =>
    _stmt = stmt
    _next = None
    _done = false
    _prefetch()

  fun ref _prefetch() =>
    if _done then return end
    match \exhaustive\ _stmt.fetch()
    | let row: Row => _next = row
    | EndOfRows => _done = true; _next = None
    | let e: FetchError => _next = e; _done = true
    end

  fun ref has_next(): Bool =>
    _next isnt None

  fun ref next(): (Row val | FetchError) ? =>
    match _next
    | let row: Row =>
      _next = None
      _prefetch()
      row
    | let e: FetchError =>
      _next = None
      e
    else
      error
    end