use ndarray::Array2;
use num_traits::Zero;
use std::clone::Clone;
use std::ops::{Add, Div, Mul, Sub};
#[enum_dispatch]
pub trait StencilOperations<A> {
fn dot_inplace<T>(&self, v: &[T], u: &mut [T])
where
T: Mul<Output = T>
+ Sub<Output = T>
+ Div<Output = T>
+ Add<Output = T>
+ Add<A, Output = T>
+ Mul<A, Output = T>
+ Div<A, Output = T>
+ Sub<A, Output = T>
+ Zero
+ Clone
+ Copy;
fn solve_inplace<T>(&self, u: &[T], v: &mut [T])
where
T: Mul<Output = T>
+ Sub<Output = T>
+ Div<Output = T>
+ Add<Output = T>
+ Add<A, Output = T>
+ Mul<A, Output = T>
+ Div<A, Output = T>
+ Sub<A, Output = T>
+ Zero
+ Clone
+ Copy;
fn to_array(&self) -> Array2<A>;
fn pinv(&self) -> Array2<A>;
}