///|
pub fn shuffled_indices(size : Int, seed : UInt64) -> Array[Int] {
  let n = if size < 0 { 0 } else { size }
  let result = Array::new(capacity=n)
  for i in 0.. 0 {
      let temporary = result[i]
      result[i] = result[j]
      result[j] = temporary
    }
  }
  result
}

///|
pub fn systematic_sample(
  size : Int,
  sample_size : Int,
  seed : UInt64,
) -> Array[Int] {
  let n = if size < 0 { 0 } else { size }
  let target = if sample_size < 0 {
    0
  } else if sample_size > n {
    n
  } else {
    sample_size
  }
  if target == 0 {
    return []
  }
  let step = n.to_double() / target.to_double()
  let rng = RandomState::new(seed)
  let start = rng.uniform() * step
  let result = Array::new(capacity=target)
  for i in 0.. Array[Array[Int]] {
  let n = if size < 0 { 0 } else { size }
  let result : Array[Array[Int]] = Array::new(
    capacity=if replicates > 0 { replicates } else { 0 },
  )
  let rng = RandomState::new(seed)
  for _ in 0.. 0 {
        let index = (rng.uniform() * n.to_double()).to_int()
        counts[index] += 1
      }
    }
    result.push(counts)
  }
  result
}

///|
pub fn sample_variance(
  values : Array[Double],
  probabilities : Array[Double],
) -> Double {
  if values.length() == 0 || values.length() != probabilities.length() {
    return 0.0
  }
  let center = weighted_mean(values, probabilities)
  let mut result = 0.0
  let mut total = 0.0
  for i in 0.. Array[Double] {
  let center = mean(values)
  let result = Array::new(capacity=values.length())
  for value in values {
    result.push(value - center)
  }
  result
}

///|
pub fn delete_one_mean(values : Array[Double]) -> Array[Double] {
  let result = Array::new(capacity=values.length())
  for excluded in 0.. Array[Double] {
  let result = Array::new(capacity=if draws > 0 { draws } else { 0 })
  if values.length() == 0 || values.length() != weights.length() {
    return result
  }
  let total = sum(weights)
  let rng = RandomState::new(seed)
  for _ in 0..= target {
        selected = i
        break
      }
    }
    result.push(values[selected])
  }
  result
}