use crate::integer::Integer;
use malachite_base::num::arithmetic::traits::{AddMulAssign, SubMulAssign};
use malachite_base::num::basic::traits::Zero;
pub fn vec_dot_general_naive(
initial: Option<&Integer>,
subtract: bool,
xs: &[Integer],
ys: &[Integer],
reverse: bool,
) -> Integer {
let len = xs.len();
assert_eq!(ys.len(), len);
let y = |i: usize| if reverse { &ys[len - 1 - i] } else { &ys[i] };
let (mut result, start) = if let Some(initial) = initial {
(initial.clone(), 0)
} else {
if len == 0 {
return Integer::ZERO;
}
let first = &xs[0] * y(0);
(if subtract { -first } else { first }, 1)
};
for (i, x) in xs.iter().enumerate().skip(start) {
if subtract {
result.sub_mul_assign(x, y(i));
} else {
result.add_mul_assign(x, y(i));
}
}
result
}