use std::ops::AddAssign;
use num_traits::Float;
use crate::{Discrete, TransferFunction};
pub(crate) fn transfer_function<T: Float + AddAssign>(a: &[T], b: &[T], input_delay: usize) -> TransferFunction<T, Discrete> {
let order = a.len().max(input_delay + b.len().saturating_sub(1));
let mut denom = Vec::with_capacity(order + 1);
denom.push(T::one());
denom.extend(a.iter().map(|&ai| -ai));
denom.resize(order + 1, T::zero());
let mut numer = vec![T::zero(); input_delay];
numer.extend_from_slice(b);
numer.resize(order + 1, T::zero());
TransferFunction::discrete(&numer, &denom)
}