///|
pub fn moving_average(
  values : ArrayView[Double],
  radius : Int,
) -> Array[Double] {
  let output : Array[Double] = []
  for i in 0.. Array[Double] {
  let output : Array[Double] = []
  for i in 0.. Array[Double] {
  let output : Array[Double] = []
  for i in 0.. Array[Double] {
  let output : Array[Double] = []
  for i in 0.. Array[Double] {
  let output : Array[Double] = []
  for i in 0.. Array[Double] {
  let output : Array[Double] = []
  if values.length() > 0 {
    output.push(0.0)
    for i in 1.. Array[Double] {
  first_difference(first_difference(values))
}

///|
pub fn cumulative_sum(values : ArrayView[Double]) -> Array[Double] {
  let output : Array[Double] = []
  let mut total = 0.0
  for value in values {
    if is_finite(value) {
      total += value
    }
    output.push(total)
  }
  output
}

///|
pub fn exponential_smooth(
  values : ArrayView[Double],
  alpha : Double,
) -> Array[Double] {
  let output : Array[Double] = []
  let mut previous = 0.0
  let factor = alpha.clamp(min=0.0, max=1.0)
  for i in 0.. Array[Double] {
  let n = values.length()
  if n < 2 {
    values.to_owned()
  } else {
    let mut sx = 0.0
    let mut sy = 0.0
    let mut sxx = 0.0
    let mut sxy = 0.0
    for i in 0.. Array[Double] {
  let s = summary(values)
  if s.variance == 0.0 {
    values.map(fn(_) { 0.0 })
  } else {
    values.map(fn(value) { (value - s.mean) / s.variance.sqrt() })
  }
}