Remova com segurança itens de uma tabela de matriz enquanto iterar

Esta questão é semelhante aComo posso iterar com segurança uma tabela de lua enquanto as chaves estão sendo removidas mas distintamente diferente.

Resumo

Dado um array Lua (tabela com chaves que são inteiros sequenciais a partir de1), qual é a melhor maneira de percorrer este arraye excluir algumas das entradas como elas são vistas?

Exemplo do mundo real

Eu tenho uma matriz de entradas com registro de data e hora em uma tabela de matriz Lua. As entradas são sempre adicionadas ao final da matriz (usandotable.insert).

local timestampedEvents = {}
function addEvent( data )
  table.insert( timestampedEvents, {getCurrentTime(),data} )
end

Eu preciso ocasionalmente percorrer esta tabela (em ordem) e processar e remover certas entradas:

function processEventsBefore( timestamp )
  for i,stamp in ipairs( timestampedEvents ) do
    if stamp[1] <= timestamp then
      processEventData( stamp[2] )
      table.remove( timestampedEvents, i )
    end
  end
end

Infelizmente, a abordagem acima do código interrompe a iteração, pulando algumas entradas. Existe alguma maneira melhor (menos de digitação, mas ainda segura) de fazer isso do que andar manualmente os índices:

function processEventsBefore( timestamp )
  local i = 1
  while i <= #timestampedEvents do -- warning: do not cache the table length
    local stamp = timestampedEvents[i]
    if stamp[1] <= timestamp then
      processEventData( stamp[2] )
      table.remove( timestampedEvents, i )
    else
      i = i + 1
    end
  end
end

questionAnswers(9)

yourAnswerToTheQuestion