pub mod row;
pub mod col;
use crate::matrix::Matrix;
use crate::parser::OpKind;
pub fn apply(
m: &Matrix,
kind: OpKind,
op: &crate::math::RowOperation,
) -> Result<Matrix, String> {
let target = op.target.saturating_sub(1);
let mult = op.first_operand().map(|o| o.to_f64()).unwrap_or(1.0);
let src = op.source_row().map(|s| s.saturating_sub(1));
let col_src = op.source_col().map(|s| s.saturating_sub(1));
match kind {
OpKind::Row => match op.operator {
crate::math::Operator::Add => Ok(row::add_multiple(m, target, src.ok_or("missing src")?, mult)),
crate::math::Operator::Subtract => Ok(row::add_multiple(m, target, src.ok_or("missing src")?, -mult)),
crate::math::Operator::Multiply => Ok(row::multiply_row(m, target, mult)),
crate::math::Operator::Replace => Ok(row::replace_row(m, target, src.ok_or("missing src")?)),
},
OpKind::Col => match op.operator {
crate::math::Operator::Add => Ok(col::add_multiple(m, target, col_src.ok_or("missing src")?, mult)),
crate::math::Operator::Subtract => Ok(col::add_multiple(m, target, col_src.ok_or("missing src")?, -mult)),
crate::math::Operator::Multiply => Ok(col::multiply_col(m, target, mult)),
crate::math::Operator::Replace => Ok(col::replace_col(m, target, col_src.ok_or("missing src")?)),
},
}
}