///|
pub fn median(data : Array[Double]) -> Double {
  if data.length() == 0 {
    return 0.0
  }
  let sorted = []
  for v in data {
    sorted.push(v)
  }
  sorted.sort()

  let n = sorted.length()
  if n % 2 == 1 {
    sorted[n / 2]
  } else {
    (sorted[n / 2 - 1] + sorted[n / 2]) / 2.0
  }
}

///|
pub fn mad(data : Array[Double]) -> Double {
  if data.length() == 0 {
    return 0.0
  }
  let med = median(data)
  let devs = []
  for v in data {
    let mut diff = v - med
    if diff < 0.0 {
      diff = -diff
    }
    devs.push(diff)
  }
  median(devs) * 1.4826
}