/**
 * @fileoverview Modelo de evento da trilha de execução.
 *
 * Cada operação relevante feita pelo aluno na InstrumentedList gera um
 * evento com a estrutura abaixo. A trilha completa (array de eventos) é
 * passada ao SortingValidationEngine para detectar qual algoritmo foi usado.
 *
 * Tipos de evento:
 *
 *   compare  — lista_comparar(i, j, op): comparação entre posições i e j.
 *   swap     — lista_trocar(i, j): troca dos valores nas posições i e j.
 *   read     — lista_ler(i): leitura do valor na posição i.
 *   write    — lista_escrever(i, v): escrita do valor v na posição i.
 *
 * Exemplos:
 *
 *   { type: "compare", i: 0, j: 1 }
 *   { type: "swap",    i: 0, j: 1 }
 *   { type: "read",    i: 2 }
 *   { type: "write",   i: 3, value: 7 }
 *
 * @typedef {Object} TraceEvent
 * @property {"compare"|"swap"|"read"|"write"} type
 * @property {number} i
 * @property {number} [j]
 * @property {number} [value]
 */

/**
 * Cria um evento de comparação entre posições i e j.
 * @param {number} i
 * @param {number} j
 * @returns {TraceEvent}
 */
export function compareEvent(i, j) {
  return { type: "compare", i, j };
}

/**
 * Cria um evento de troca entre posições i e j.
 * @param {number} i
 * @param {number} j
 * @returns {TraceEvent}
 */
export function swapEvent(i, j) {
  return { type: "swap", i, j };
}

/**
 * Cria um evento de leitura na posição i.
 * @param {number} i
 * @returns {TraceEvent}
 */
export function readEvent(i) {
  return { type: "read", i };
}

/**
 * Cria um evento de escrita na posição i com valor value.
 * @param {number} i
 * @param {number} value
 * @returns {TraceEvent}
 */
export function writeEvent(i, value) {
  return { type: "write", i, value };
}
