///|
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
}