///|
pub fn clamp_percentile_bp(value : Int) -> Int {
  if value < 0 {
    0
  } else if value > 10000 {
    10000
  } else {
    value
  }
}

///|
pub fn SampleSummary::percentile(
  self : SampleSummary,
  percentile_bp : Int,
) -> Int {
  let count = self.count()
  if count == 0 {
    0
  } else if count == 1 {
    self.values[0]
  } else {
    let bp = clamp_percentile_bp(percentile_bp)
    let rank = ((count - 1) * bp + 9999) / 10000
    self.values[rank]
  }
}

///|
pub fn SampleSummary::p50(self : SampleSummary) -> Int {
  self.percentile(5000)
}

///|
pub fn SampleSummary::p90(self : SampleSummary) -> Int {
  self.percentile(9000)
}

///|
pub fn SampleSummary::p95(self : SampleSummary) -> Int {
  self.percentile(9500)
}

///|
pub fn SampleSummary::p99(self : SampleSummary) -> Int {
  self.percentile(9900)
}