diff --git a/kalk/src/prelude/mod.rs b/kalk/src/prelude/mod.rs index 03f39d4..24ef2b1 100644 --- a/kalk/src/prelude/mod.rs +++ b/kalk/src/prelude/mod.rs @@ -109,6 +109,7 @@ lazy_static! { let mut m = HashMap::new(); m.insert("average", VectorFuncInfo(average, Other)); m.insert("diag", VectorFuncInfo(diag, Other)); + m.insert("matrix", VectorFuncInfo(matrix, Other)); m.insert("max", VectorFuncInfo(max, Other)); m.insert("min", VectorFuncInfo(min, Other)); m.insert("perms", VectorFuncInfo(perms, Other)); @@ -760,6 +761,28 @@ pub mod funcs { }) } + pub fn matrix(x: KalkValue) -> Result { + let rows = as_vector_or_return!(x); + let column_width = + if let KalkValue::Vector(first_vec) = rows.first().unwrap_or(&KalkValue::nan()) { + first_vec.len() + } else { + 0 + }; + + let mut columns = Vec::new(); + for value in rows { + let column = as_vector_or_return!(value); + if column.len() != column_width { + return Err(KalkError::InconsistentColumnWidths); + } + + columns.push(column); + } + + Ok(KalkValue::Matrix(columns)) + } + pub fn max(x: KalkValue) -> Result { let values = as_vector_or_return!(x); let mut max = &values[0];