///|
fn build_events(
  drivers : Array[String],
  states : Array[DriverLapState],
  lap_count : Int,
) -> Array[RaceEvent] {
  let events : Array[RaceEvent] = []
  let driver_count = drivers.length()
  for lap = 1; lap <= lap_count; lap = lap + 1 {
    let start = (lap - 1) * driver_count
    if lap > 1 {
      let previous_lead_state = states[start - driver_count]
      let current_lead_state = states[start]
      if previous_lead_state.track_status != current_lead_state.track_status {
        events.push(
          TrackStatusChange({
            lap,
            previous: previous_lead_state.track_status,
            current: current_lead_state.track_status,
          }),
        )
      }
      if previous_lead_state.weather != current_lead_state.weather {
        events.push(
          WeatherChange({
            lap,
            previous: previous_lead_state.weather,
            current: current_lead_state.weather,
          }),
        )
      }
    }
    for offset = 0; offset < driver_count; offset = offset + 1 {
      let state = states[start + offset]
      if state.pit {
        let next_compound = if lap == lap_count {
          None
        } else {
          Some(states[start + driver_count + offset].compound)
        }
        events.push(
          PitStop({
            lap,
            driver: state.driver,
            outgoing_compound: state.compound,
            next_compound,
          }),
        )
      }
    }
    if lap > 1 {
      for offset = 0; offset < driver_count; offset = offset + 1 {
        let previous = states[start - driver_count + offset]
        let current = states[start + offset]
        if previous.position != current.position {
          events.push(
            PositionChange({
              lap,
              driver: current.driver,
              previous_position: previous.position,
              current_position: current.position,
            }),
          )
        }
      }
    }
  }
  events
}