///|
pub fn sine_wave(
  length~ : Int,
  sample_rate~ : Double,
  frequency~ : Double,
  amplitude? : Double = 1.0,
) -> Array[Double] raise SpectrumError {
  validate_signal_args(length, sample_rate)
  let out : Array[Double] = []
  for i in 0.. Array[Double] raise SpectrumError {
  validate_signal_args(length, sample_rate)
  let out : Array[Double] = []
  for i in 0..= 0.0 { amplitude } else { -amplitude })
  }
  out
}

///|
pub fn impulse(
  length~ : Int,
  index? : Int = 0,
  amplitude? : Double = 1.0,
) -> Array[Double] raise SpectrumError {
  if length <= 0 {
    raise EmptySignal
  }
  if index < 0 || index >= length {
    raise InvalidArgument(message="impulse index out of range")
  }
  let out = Array::make(length, 0.0)
  out[index] = amplitude
  out
}

///|
pub fn chirp(
  length~ : Int,
  sample_rate~ : Double,
  start_hz~ : Double,
  end_hz~ : Double,
  amplitude? : Double = 1.0,
) -> Array[Double] raise SpectrumError {
  validate_signal_args(length, sample_rate)
  let duration = Double::from_int(length) / sample_rate
  let slope = (end_hz - start_hz) / duration
  let out : Array[Double] = []
  for i in 0.. Array[Double] raise SpectrumError {
  if length <= 0 {
    raise EmptySignal
  }
  let out : Array[Double] = []
  let mut state = seed.reinterpret_as_int() % 2147483
  for _ in 0.. Array[Double] raise SpectrumError {
  validate_signal_args(length, sample_rate)
  if frequency <= 0.0 || frequency > sample_rate / 2.0 {
    raise InvalidArgument(message="frequency must be between zero and Nyquist")
  }
  let out : Array[Double] = []
  for i in 0.. Array[Double] raise SpectrumError {
  validate_signal_args(length, sample_rate)
  if frequency <= 0.0 || frequency > sample_rate / 2.0 {
    raise InvalidArgument(message="frequency must be between zero and Nyquist")
  }
  let out : Array[Double] = []
  for i in 0.. Array[Double] raise SpectrumError {
  if length <= 0 || period <= 0 {
    raise InvalidArgument(message="length and period must be positive")
  }
  let out = Array::make(length, 0.0)
  for i in 0.. Unit raise SpectrumError {
  if length <= 0 {
    raise EmptySignal
  }
  if sample_rate <= 0.0 {
    raise InvalidArgument(message="sample_rate must be positive")
  }
}