Class OverloadedUnaryFunction

java.lang.Object
com.singularsys.jep.functions.PostfixMathCommand
com.singularsys.jep.functions.UnaryFunction
com.singularsys.jep.misc.overloadedfunctions.OverloadedUnaryFunction
All Implemented Interfaces:
JepComponent, PostfixMathCommandI, Serializable

public class OverloadedUnaryFunction extends UnaryFunction implements JepComponent
Allows function to be overloaded with two candidate functions and a predicate that tests the values of the arguments to see which function should be applied. For example if we have a custom value type
        class MyVal {
                double val;

                public MyVal(double val) {
                        super();
                        this.val = val;
                }

                MyVal neg() {
                        return new MyVal(-val);
                }
        }
 
The addition operator could be overload with a custom function that uses the MyVal.add(MyVal) method.
        var fun1 = new OverloadedUnaryFunction(
                UnaryFunction.instanceOf(MyVal.class, x -> x.neg() ),
                new Add(),
                l -> l instanceof MyVal );
        jep.getOperatorTable().getUminus().setPFMC(fun1);
        jep.reinitializeComponents();
 

In the constructor for the OverloadedFunction the first argument is our new function created by using a lambda expression and the static method UnaryFunction.instanceOf(Class, FunctionWithException) . The second argument is the regular unary minus function and the third argument is the predicate that returns true when the argument is a MyVal.

With this setup jep.evaluate(jep.parse("'abc' * 3")) returns abcabcabc and jep.evaluate(jep.parse("4 * 3")) returns 12.

Note in practice you would not want to test on the value of node as it will not be able to test the value when it is the result of a sub-expression, like ('ab'*2)*2.

Since:
Jep 4.1
See Also: