///|
fn sinc(x : Double) -> Double {
  if x == 0.0 {
    1.0
  } else {
    let px = @math.PI * x
    @math.sin(px) / px
  }
}

///|
pub fn resample_linear(
  signal : ArrayView[Double],
  target_length : Int,
) -> Array[Double] raise SpectrumError {
  let n = signal.length()
  if n == 0 {
    raise EmptySignal
  }
  if target_length <= 0 {
    raise InvalidArgument(message="target_length must be positive")
  }
  if target_length == 1 {
    return [signal[0]]
  }
  if n == 1 {
    return Array::make(target_length, signal[0])
  }
  let out = Array::make(target_length, 0.0)
  let ratio = Double::from_int(n - 1) / Double::from_int(target_length - 1)
  for i in 0.. Array[Double] raise SpectrumError {
  let n = signal.length()
  if n == 0 {
    raise EmptySignal
  }
  if target_length <= 0 {
    raise InvalidArgument(message="target_length must be positive")
  }
  if target_length == 1 {
    return [signal[0]]
  }
  if n == 1 {
    return Array::make(target_length, signal[0])
  }
  let out = Array::make(target_length, 0.0)
  let ratio = Double::from_int(n - 1) / Double::from_int(target_length - 1)
  for i in 0..