auto Program::rewindSetMode(Rewind::Mode mode) -> void {
  rewind.mode = mode;
  rewind.counter = 0;
}

auto Program::rewindReset() -> void {
  rewindSetMode(Rewind::Mode::Playing);
  rewind.history.reset();
  rewind.length = settings.rewind.length;
  rewind.frequency = settings.rewind.frequency;
}

auto Program::rewindRun() -> void {
  if(!settings.general.rewind) return;  //rewind disabled?

  if(rewind.mode == Rewind::Mode::Playing) {
    if(++rewind.counter < rewind.frequency) return;
    rewind.counter = 0;
    if(rewind.history.size() >= rewind.length) rewind.history.takeFirst();
    auto s = emulator->root->serialize(0);
    rewind.history.append(s);
  }

  if(rewind.mode == Rewind::Mode::Rewinding) {
    if(!rewind.history.size()) return rewindSetMode(Rewind::Mode::Playing);  //nothing left to rewind?
    if(++rewind.counter < rewind.frequency / 5) return;  //rewind 5x faster than playing
    rewind.counter = 0;
    auto s = rewind.history.takeLast();
    s.setReading();
    emulator->root->unserialize(s);
    if(!rewind.history) {
      showMessage("Rewind history exhausted");
      rewindReset();
    }
  }
}
