///|
/// Find all features with a matching key.
pub fn Record::features_by_key(self : Record, key : String) -> Array[Feature] {
  self.features.filter(fn(feature) { feature.key == key })
}

///|
/// Return all features that carry a named qualifier.
pub fn Record::features_with_qualifier(
  self : Record,
  name : String,
) -> Array[Feature] {
  self.features.filter(fn(feature) { feature.qualifier(name) is Some(_) })
}

///|
/// Look up the first qualifier value by name.
pub fn Feature::qualifier(self : Feature, name : String) -> String? {
  for value = None, i = 0; i < self.qualifiers.length(); i = i + 1 {
    if value is Some(_) {
      continue value, i + 1
    }
    let qualifier = self.qualifiers[i]
    if qualifier.name == name {
      continue qualifier.value, i + 1
    }
    continue value, i + 1
  } nobreak {
    value
  }
}

///|
/// True when any parsed range overlaps a 1-based inclusive query span.
pub fn Feature::overlaps(self : Feature, start : Int, end : Int) -> Bool {
  if start > end {
    false
  } else {
    self.location.ranges.any(fn(range) {
      range.start <= end && start <= range.end
    })
  }
}