///|
/// Returns events carrying a given correlation identifier.
pub fn[P] events_by_correlation(
  journal : Journal[P],
  correlation_id : String,
) -> Array[JournalEvent[P]] {
  let result : Array[JournalEvent[P]] = []
  for event in journal.events() {
    if event.correlation_id == correlation_id {
      result.push(event)
    }
  }
  result
}

///|
/// Returns events with an exact application event kind.
pub fn[P] events_by_kind(
  journal : Journal[P],
  kind : String,
) -> Array[JournalEvent[P]] {
  let result : Array[JournalEvent[P]] = []
  for event in journal.events() {
    if event.kind == kind {
      result.push(event)
    }
  }
  result
}

///|
/// Returns events in an inclusive sequence range.
///
/// This is an investigation view, not a replayable journal. Original sequence
/// and hash evidence remain attached to every returned event.
pub fn[P] events_in_range(
  journal : Journal[P],
  first_sequence : Int,
  last_sequence : Int,
) -> Array[JournalEvent[P]] {
  let result : Array[JournalEvent[P]] = []
  if first_sequence > last_sequence {
    return result
  }
  for event in journal.events() {
    if event.sequence >= first_sequence && event.sequence <= last_sequence {
      result.push(event)
    }
  }
  result
}