From b22dd001774151696ecacbe630e0c1bd1d9425d1 Mon Sep 17 00:00:00 2001 From: Rendo Date: Sat, 8 Nov 2025 14:14:54 +0500 Subject: [PATCH] Handler in node --- src/node/mod.rs | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/src/node/mod.rs b/src/node/mod.rs index 281cbee..1921382 100644 --- a/src/node/mod.rs +++ b/src/node/mod.rs @@ -1,37 +1,54 @@ use crate::node::node_modifier::NodeModifier; +use handler::*; +mod handler; mod node_modifier; pub struct Node { children: Vec, - function: fn(Vec) -> f64, + handler: Box, } impl Node { - pub fn new(children: Option>, function: Option) -> f64>) -> Self { + pub fn new(children: Option>, handler: T) -> Self + where + T: NodeHandler + 'static, + { Self { children: children.unwrap_or(vec![]), - function: function.unwrap_or(|_| 0f64), - } - } - pub fn empty() -> Self { - Self { - children: vec![], - function: |_| 0f64, + handler: Box::new(handler), } } pub fn get_value(&self) -> f64 { if self.children.len() == 0 { - return (self.function)(vec![0f64]); + return self.handler.run(vec![0f64]); } let mut inputs: Vec = vec![]; for node in &self.children { inputs.push(node.get_value()); } - return (self.function)(inputs); + return self.handler.run(inputs); } pub fn modify_tree<'a>(&'a mut self) -> NodeModifier<'a> { NodeModifier::from_random(self) } + pub fn number(n: f64) -> Node { + Node { + children: vec![], + handler: Box::new(NodeNumber::new(Some(n))), + } + } + pub fn function(func: fn(Vec) -> f64) -> Node { + Node { + children: vec![], + handler: Box::new(NodeFunction::new(func)), + } + } + pub fn variable(getter: fn() -> f64) -> Node { + Node { + children: vec![], + handler: Box::new(NodeVariable::new(getter)), + } + } }