///|
fn split_words(s : String) -> Array[String] {
  s
  .split(" ")
  .filter_map(fn(part) {
    let word = part.trim().to_owned()
    if word == "" {
      None
    } else {
      Some(word)
    }
  })
  .to_array()
}

///|
fn parse_int(text : String) -> Int raise GenBankError {
  let s = text.trim().to_owned()
  let mut value = 0
  for ch in s {
    if ch < '0' || ch > '9' {
      raise GenBankError::InvalidNumber(s)
    }
    value = value * 10 + (ch.to_int() - '0'.to_int())
  }
  value
}

///|
fn field_value(line : String, name : String) -> String? {
  if line.has_prefix(name) {
    Some(
      line
      .unsafe_substring(start=name.length(), end=line.length())
      .trim()
      .to_owned(),
    )
  } else {
    None
  }
}