///|
fn write_csv_rows(
  builder : StringBuilder,
  full_name : String,
  changes : Array[SignalChange],
) -> Unit {
  for change in changes {
    builder.write_string(change.timestamp.to_string())
    builder.write_char(',')
    builder.write_string(full_name)
    builder.write_char(',')
    builder.write_string(change.value)
    builder.write_char('\n')
  }
}

///|
/// Export one signal in `timestamp,signal,value` form.
pub fn export_signal_csv(
  vcd : VcdFile,
  full_name : String,
) -> String raise VcdError {
  let changes = signal_changes(vcd, full_name)
  let builder = StringBuilder()
  builder.write_string("timestamp,signal,value\n")
  write_csv_rows(builder, full_name, changes)
  builder.to_string()
}

///|
/// Export all parsed changes in `timestamp,signal,value` form.
pub fn export_csv(vcd : VcdFile) -> String raise VcdError {
  let builder = StringBuilder()
  builder.write_string("timestamp,signal,value\n")
  for change in vcd.changes {
    let full_name = match find_signal_by_identifier(vcd, change.identifier) {
      Some(signal) => signal.full_name
      None => raise VcdError("unknown signal identifier '\{change.identifier}'")
    }
    builder.write_string(change.timestamp.to_string())
    builder.write_char(',')
    builder.write_string(full_name)
    builder.write_char(',')
    builder.write_string(change.value)
    builder.write_char('\n')
  }
  builder.to_string()
}