From 80c9d47399bfc6ba773a40b32de13f460cf18a33 Mon Sep 17 00:00:00 2001 From: Rendo Date: Sun, 9 Nov 2025 11:58:50 +0500 Subject: [PATCH] Display as text --- src/formula.rs | 3 +++ src/node/mod.rs | 22 +++++++++++++++++++++- src/tests.rs | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/formula.rs b/src/formula.rs index ca4e186..c9e4833 100644 --- a/src/formula.rs +++ b/src/formula.rs @@ -53,4 +53,7 @@ impl Formula { self.display_recursion(indent_level + 1, next_nodes); } } + pub fn as_text(&self) -> String { + self.tree.as_text() + } } diff --git a/src/node/mod.rs b/src/node/mod.rs index ce00cc6..293a6a0 100644 --- a/src/node/mod.rs +++ b/src/node/mod.rs @@ -78,6 +78,26 @@ impl Node { pub fn modify_tree(&mut self) -> NodeModifier { NodeModifier::from_node(self, None) } + pub fn as_text(&self) -> String { + let mut children_text = "".to_string(); + if self.children.len() > 0 { + for i in 0..self.children.len() { + children_text += (&self.children[i]).as_text().as_str(); + if i < self.children.len() - 1 { + children_text += ","; + } + } + } + match &self.handler { + NodeHandler::Function { + name, + function, + max_args, + } => name.clone() + "(" + children_text.as_str() + ")", + NodeHandler::Empty => children_text, + _ => self.to_string(), + } + } } impl fmt::Display for Node { @@ -93,7 +113,7 @@ impl fmt::Display for Node { max_args, } => name.clone(), NodeHandler::Variable => "X".to_string(), - NodeHandler::Empty => "Empty".to_string(), + NodeHandler::Empty => "".to_string(), } ) } diff --git a/src/tests.rs b/src/tests.rs index 234e12b..bfe4de7 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -52,3 +52,40 @@ fn test_branch_sum() { let results = formula.run(vec![0f64, 1f64, 2f64, 3f64, 4f64, 5f64]); assert_eq!(results, vec![1f64, 2f64, 3f64, 4f64, 5f64, 6f64]) } + +#[test] +fn test_display_as_text() { + let mut formula = Formula::new(); + assert!( + formula + .modify_tree() + .insert_node( + Node::function("sum".to_string(), |inputs| inputs.iter().sum(), None), + None + ) + .is_err() + == false + ); + assert!( + formula + .modify_tree() + .go_down(0) + .add_node(Node::function( + "sin".to_string(), + |inputs| inputs[0].sin(), + Some(1) + )) + .is_err() + == false + ); + assert!( + formula + .modify_tree() + .go_down(0) + .go_down(1) + .add_node(Node::variable()) + .is_err() + == false + ); + assert_eq!(formula.as_text(), "sum(X,sin(X))".to_string()); +}