use crate::error::{Exception, Result};
use crate::utils::guard::Guarded;
use crate::{Array, Stream};
fn checked_length(n: usize) -> Result<i32> {
i32::try_from(n).map_err(|_| Exception::custom("FFT length exceeds i32::MAX"))
}
pub fn fftfreq(n: usize, d: f64) -> Result<Array> {
let n = checked_length(n)?;
let stream = Stream::thread_local_or_default();
Array::try_from_op(|res| unsafe { mlx_sys::mlx_fft_fftfreq(res, n, d, stream.as_ptr()) })
}
pub fn rfftfreq(n: usize, d: f64) -> Result<Array> {
let n = checked_length(n)?;
let stream = Stream::thread_local_or_default();
Array::try_from_op(|res| unsafe { mlx_sys::mlx_fft_rfftfreq(res, n, d, stream.as_ptr()) })
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn rejects_lengths_above_i32_max() {
assert!(fftfreq(usize::MAX, 1.0).is_err());
assert!(rfftfreq(usize::MAX, 1.0).is_err());
}
}