///|
pub struct MailboxIndex {
  messages : Array[MailMessage]
  domains : Array[String]
  stats : MailStats
} derive(Eq, Debug)

///|
pub fn build_index(messages : Array[MailMessage]) -> MailboxIndex {
  { messages, domains: all_domains(messages), stats: compute_stats(messages) }
}

///|
pub fn index_search(
  index : MailboxIndex,
  input : MailQuery,
) -> Array[MailMessage] {
  filter_messages(index.messages, input)
}

///|
pub fn index_domain_count(index : MailboxIndex) -> Int {
  index.domains.length()
}

///|
pub fn index_subjects(index : MailboxIndex) -> Array[String] {
  let out : Array[String] = []
  for message in index.messages {
    out.push(message.subject)
  }
  out
}

///|
pub fn index_report(index : MailboxIndex) -> String {
  "MailboxIndex messages=" +
  index.messages.length().to_string() +
  " domains=" +
  index.domains.length().to_string() +
  " " +
  stats_summary(index.stats)
}