///|
pub(all) struct SampleSummary {
  name : String
  values : Array[Int]
} derive(Eq, Debug)

///|
pub fn SampleSummary::new(name : String) -> SampleSummary {
  { name, values: [] }
}

///|
pub fn SampleSummary::from_array(
  name : String,
  samples : Array[Int],
) -> SampleSummary {
  let mut summary = SampleSummary::new(name)
  for sample in samples {
    summary = summary.add(sample)
  }
  summary
}

///|
pub fn SampleSummary::add(self : SampleSummary, value : Int) -> SampleSummary {
  let mut inserted = false
  let output : Array[Int] = []
  for current in self.values {
    if !inserted && value <= current {
      output.push(value)
      inserted = true
    }
    output.push(current)
  }
  if !inserted {
    output.push(value)
  }
  { name: self.name, values: output }
}

///|
pub fn SampleSummary::count(self : SampleSummary) -> Int {
  self.values.length()
}

///|
pub fn SampleSummary::is_empty(self : SampleSummary) -> Bool {
  self.count() == 0
}

///|
pub fn SampleSummary::min(self : SampleSummary) -> Int {
  if self.is_empty() {
    0
  } else {
    self.values[0]
  }
}

///|
pub fn SampleSummary::max(self : SampleSummary) -> Int {
  let count = self.count()
  if count == 0 {
    0
  } else {
    self.values[count - 1]
  }
}