///|
pub fn robust_covariance(
  x : Array[Double],
  y : Array[Double],
  trim_percent : Double,
) -> Double {
  if x.length() != y.length() || x.length() == 0 {
    return 0.0
  }

  let w_x = winsorize(x, trim_percent)
  let w_y = winsorize(y, trim_percent)

  let n = w_x.length().to_double()
  let mut sum_x = 0.0
  let mut sum_y = 0.0
  for v in w_x {
    sum_x += v
  }
  for v in w_y {
    sum_y += v
  }

  let mean_x = sum_x / n
  let mean_y = sum_y / n

  let mut cov = 0.0
  for i = 0; i < w_x.length(); i = i + 1 {
    cov += (w_x[i] - mean_x) * (w_y[i] - mean_y)
  }
  if n <= 1.0 {
    0.0
  } else {
    cov / (n - 1.0)
  }
}