///|
pub fn split_multi_allelic(record : VcfRecord) -> Array[VcfRecord] {
  if record.alt_alleles.length() <= 1 {
    [record]
  } else {
    let records : Array[VcfRecord] = []
    for alt_index, alt in record.alt_alleles {
      records.push(copy_record_with_alt(record, alt, alt_index~))
    }
    records
  }
}

///|
pub fn normalize_basic(record : VcfRecord) -> VcfRecord {
  if record.alt_alleles.length() != 1 {
    record
  } else {
    let (pos, ref_allele, alt_allele) = @normalize.trim_common(
      record.ref_allele,
      record.alt_alleles[0],
      pos=record.pos,
    )
    {
      chrom: record.chrom,
      pos,
      ids: record.ids,
      ref_allele,
      alt_alleles: [alt_allele],
      qual: record.qual,
      filters: record.filters,
      info: record.info,
      format_keys: record.format_keys,
      samples: record.samples,
    }
  }
}

///|
fn copy_record_with_alt(
  record : VcfRecord,
  alt : String,
  alt_index~ : Int,
) -> VcfRecord {
  {
    chrom: record.chrom,
    pos: record.pos,
    ids: record.ids,
    ref_allele: record.ref_allele,
    alt_alleles: [alt],
    qual: record.qual,
    filters: record.filters,
    info: split_info_for_alt(record.info, alt_index~),
    format_keys: record.format_keys,
    samples: record.samples,
  }
}

///|
fn split_info_for_alt(
  info : Array[(String, VcfValue)],
  alt_index~ : Int,
) -> Array[(String, VcfValue)] {
  let split : Array[(String, VcfValue)] = []
  for pair in info {
    let (key, value) = pair
    split.push(
      (
        key,
        match value {
          VcfValue::List(values) =>
            if alt_index < values.length() {
              values[alt_index]
            } else {
              value
            }
          _ => value
        },
      ),
    )
  }
  split
}