///|
pub fn trimmed_mean(data : Array[Double], trim_percent : Double) -> Double {
  if data.length() == 0 {
    return 0.0
  }
  if trim_percent < 0.0 || trim_percent >= 0.5 {
    abort("trim_percent must be in [0, 0.5)")
  }

  let sorted = []
  for v in data {
    sorted.push(v)
  }
  sorted.sort()

  let n = sorted.length()
  let k = (n.to_double() * trim_percent).to_int()

  if k * 2 >= n {
    return 0.0
  }

  let mut sum = 0.0
  for i = k; i < n - k; i = i + 1 {
    sum += sorted[i]
  }
  sum / (n - 2 * k).to_double()
}