///|
pub fn select_info_fields(
  record : VcfRecord,
  keys : Array[String],
) -> VcfRecord {
  let selected : Array[(String, VcfValue)] = []
  for key in keys {
    for pair in record.info {
      let (item_key, value) = pair
      if item_key == key {
        selected.push((item_key, value))
        break
      }
    }
  }
  {
    chrom: record.chrom,
    pos: record.pos,
    ids: record.ids,
    ref_allele: record.ref_allele,
    alt_alleles: record.alt_alleles,
    qual: record.qual,
    filters: record.filters,
    info: selected,
    format_keys: record.format_keys,
    samples: record.samples,
  }
}

///|
pub fn select_document_samples(
  document : VcfDocument,
  names : Array[String],
) -> VcfDocument raise ParseError {
  let indexes : Array[Int] = []
  for wanted in names {
    let mut found : Int? = None
    for index, name in document.header.samples {
      if name == wanted {
        found = Some(index)
      }
    }
    match found {
      Some(index) => indexes.push(index)
      None =>
        raise ParseError::InvalidHeader(
          line=0,
          column=1,
          message="unknown sample: {wanted}",
        )
    }
  }
  let columns = if document.header.columns.length() > 9 {
    let base = document.header.columns[:9].to_owned()
    for name in names {
      base.push(name)
    }
    base
  } else {
    document.header.columns
  }
  let header = VcfHeader::{
    fileformat: document.header.fileformat,
    meta: document.header.meta,
    columns,
    samples: names,
  }
  let records = document.records.map(fn(record) {
    let samples : Array[SampleCall] = []
    for index in indexes {
      if index < record.samples.length() {
        samples.push(record.samples[index])
      }
    }
    {
      chrom: record.chrom,
      pos: record.pos,
      ids: record.ids,
      ref_allele: record.ref_allele,
      alt_alleles: record.alt_alleles,
      qual: record.qual,
      filters: record.filters,
      info: record.info,
      format_keys: record.format_keys,
      samples,
    }
  })
  { header, records }
}