use core::iter::Sum;
use std::ops::{Add, Mul, Sub};
pub fn add_vecs<L, R, P>(left: &[L], right: &[R]) -> Vec<P>
where
L: Add<R, Output = P> + Clone,
R: Clone,
{
left.iter()
.cloned()
.zip(right.iter().cloned())
.map(|(l, r)| l + r)
.collect()
}
pub fn add_vec_nv<L, R, P>(left: &[L], right: &R) -> Vec<P>
where
L: Add<R, Output = P> + Clone,
R: Clone,
{
left.iter().cloned().map(|l| l + right.clone()).collect()
}
pub fn add_nv_vec<L, R, P>(left: &L, right: &[R]) -> Vec<P>
where
L: Add<R, Output = P> + Clone,
R: Clone,
{
right.iter().cloned().map(|r| left.clone() + r).collect()
}
pub fn sub_vecs<L, R, P>(left: &[L], right: &[R]) -> Vec<P>
where
L: Sub<R, Output = P> + Clone,
R: Clone,
{
left.iter()
.cloned()
.zip(right.iter().cloned())
.map(|(l, r)| l - r)
.collect()
}
pub fn sub_vec_nv<L, R, P>(left: &[L], right: &R) -> Vec<P>
where
L: Sub<R, Output = P> + Clone,
R: Clone,
{
left.iter().cloned().map(|l| l - right.clone()).collect()
}
pub fn sub_nv_vec<L, R, P>(left: &L, right: &[R]) -> Vec<P>
where
L: Sub<R, Output = P> + Clone,
R: Clone,
{
right.iter().cloned().map(|r| left.clone() - r).collect()
}
pub fn mul_vecs<L, R, P>(left: &[L], right: &[R]) -> Vec<P>
where
L: Mul<R, Output = P> + Clone,
R: Clone,
{
left.iter()
.cloned()
.zip(right.iter().cloned())
.map(|(l, r)| l * r)
.collect()
}
pub fn mul_vec_nv<L, R, P>(left: &[L], right: &R) -> Vec<P>
where
L: Mul<R, Output = P> + Clone,
R: Clone,
{
left.iter().cloned().map(|l| l * right.clone()).collect()
}
pub fn mul_nv_vec<L, R, P>(left: &L, right: &[R]) -> Vec<P>
where
L: Mul<R, Output = P> + Clone,
R: Clone,
{
right.iter().cloned().map(|r| left.clone() * r).collect()
}
pub fn sum_vec<T, S>(summable: &[T]) -> S
where
T: Add<T, Output = S> + Clone,
S: Sum<T>,
{
summable.iter().cloned().sum()
}