diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-01-17 23:54:52 +0100 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-01-17 23:54:52 +0100 |
| commit | 95ba627a9c5e4e6e1d79f7aaff1854eb831511b4 (patch) | |
| tree | 177d58d387143d644ce7ad2c97eb30032e226533 /src/expression_function.rs | |
| parent | 9cc61497ed8a2336f33407d3262181e4ac3b46cb (diff) | |
hand context on to Function trait
Diffstat (limited to 'src/expression_function.rs')
| -rw-r--r-- | src/expression_function.rs | 18 |
1 files changed, 7 insertions, 11 deletions
diff --git a/src/expression_function.rs b/src/expression_function.rs index 35eba5f..138891f 100644 --- a/src/expression_function.rs +++ b/src/expression_function.rs @@ -1,12 +1,11 @@ use std::{collections::HashMap, iter::zip}; +use std::sync::Arc; use crate::{ - commonsense_functions, commonsense_operations, functions, complex::Complex, context::Context, expression::Expression, - operation::Operation, - function::{Function, FunctionArgument} + function::{Function, FunctionArgument, EmptyFunction} }; pub struct ExpressionFunction { @@ -38,17 +37,14 @@ impl ExpressionFunction { } impl Function for ExpressionFunction { - fn eval(&self, args: FunctionArgument) -> Result<Complex, String> { + fn eval(&self, args: FunctionArgument, ctx: &Context) -> Result<Complex, String> { if args.len() == self.args.len() { - let mut vars = HashMap::new(); + let mut nctx = ctx.clone(); for (n, v) in zip(self.args.iter(), args.data().iter()) { - vars.insert(n.to_string(), v.clone()); + nctx.set_variable(n, *v) } - let ctx = Context::new() - .with_variables(vars) - .with_functions(commonsense_functions! {}) - .with_operations(commonsense_operations! {}); - self.expr.evaluate(&ctx) + nctx.set_function(self.name(), Arc::new(EmptyFunction {})); + self.expr.evaluate(&nctx) } else { Err(format!( "{} takes {} parameters", |