Package com.singularsys.jep.misc.overloadedfunctions

# Class OverloadedBinaryFunction

java.lang.Object
com.singularsys.jep.functions.PostfixMathCommand
com.singularsys.jep.functions.BinaryFunction
com.singularsys.jep.misc.overloadedfunctions.OverloadedBinaryFunction

All Implemented Interfaces:
  `JepComponent`, `PostfixMathCommandI`, `Serializable`

public class OverloadedBinaryFunction extends BinaryFunction 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 add(MyVal arg) {
                            return new MyVal(val+arg.val);
                    }
            }

The addition operator could be overload with a custom function that uses the `MyVal.add(MyVal)` method.

            var fun1 = new OverloadedBinaryFunction(
                    BinaryFunction.instanceOf(MyVal.class, (x,y) -> x.add(y) ),
                    new Add(),
                    (l,r) -> l instanceof MyVal && r instanceof MyVal );
            jep.getOperatorTable().getAdd().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 `BinaryFunction#instanceOf(Class,BiFunctionWithException)`. The second argument is the regular multiplication function and the third argument is the predicate that returns true when the values of the lhs and rhs arguments are strings.

Since:
  Jep 4.1
See Also:
  - Serialized Form

- ## Nested Class Summary

  ## Nested classes/interfaces inherited from class com.singularsys.jep.functions.BinaryFunction

  `BinaryFunction.BiFunctionWithException<T>`

- ## Field Summary

  ### Fields inherited from class com.singularsys.jep.functions.PostfixMathCommand

  `curNumberOfParameters, description, name, NaN, numberOfParameters`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `OverloadedBinaryFunction(PostfixMathCommandI function1, PostfixMathCommandI function2, BiPredicate<Object,Object> argTest)`
  Constructor.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `Object`
  `eval(Object l, Object r)`
  Evaluate the function
  `String`
  `getDescription()`
  Return a description of the function from the properties file.
  `Object`
  `getFunction1()`
  `PostfixMathCommandI`
  `getFunction2()`
  `JepComponent`
  `getLightWeightInstance()`
  Gets a light-weight instance suitable for using in multiple threads.
  `BiPredicate<Object,Object>`
  `getPredicate()`
  `void`
  `init(Jep jep)`
  Initialize the component.

  ### Methods inherited from class com.singularsys.jep.functions.BinaryFunction

  `instanceOf, instanceOf, instanceOf, instanceOf, run`

  ### Methods inherited from class com.singularsys.jep.functions.PostfixMathCommand

  `asArray, asBool, asDouble, asInt, asLong, asStrictInt, asString, asType, checkNumberOfParameters, getDescription, getDescriptionWithType, getName, getNumberOfParameters, setCurNumberOfParameters, setDescription, setName, toString, toString`

  ### Methods inherited from class java.lang.Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

- ## Constructor Details

  - ### OverloadedBinaryFunction

    public OverloadedBinaryFunction(PostfixMathCommandI function1, PostfixMathCommandI function2, BiPredicate<Object,Object> argTest)
    Constructor. Each function can be a `BinaryFunction` or a `NaryBinaryFunction` or any other `PostfixMathCommandI` that uses the `PostfixMathCommandI.run(Stack)` method.
    Parameters:
      `function1` - the first function
      `function2` - the second function
      `argTest` - a predicate that tests the arguments

- ## Method Details

  - ### eval

    public Object eval(Object l, Object r) throws EvaluationException
    Description copied from class: `BinaryFunction`
    Evaluate the function
    Specified by:
      `eval` in class `BinaryFunction`
    Parameters:
      `l` - lhs argument
      `r` - rhs argument
    Returns:
      the results
    Throws:
      `EvaluationException` - if the function cannot be evaluated.

  - ### init

    public void init(Jep jep)
    Description copied from interface: `JepComponent`
    Initialize the component. This method is called whenever a component is added to Jep. Hence, it allows components to keep track of the other components they may rely on.
    Specified by:
      `init` in interface `JepComponent`
    Parameters:
      `jep` - the current Jep instance

  - ### getLightWeightInstance

    public JepComponent getLightWeightInstance()
    Description copied from interface: `JepComponent`
    Gets a light-weight instance suitable for using in multiple threads.
    Specified by:
      `getLightWeightInstance` in interface `JepComponent`
    Returns:
      either a new instance, null or 'this'.

  - ### getFunction1

    public Object getFunction1()

  - ### getFunction2

    public PostfixMathCommandI getFunction2()

  - ### getPredicate

    public BiPredicate<Object,Object> getPredicate()

  - ### getDescription

    public String getDescription()
    Description copied from class: `PostfixMathCommand`
    Return a description of the function from the properties file. The property name is the class name followed by ".description". The property is found using the `JepMessages` class, which can be configured to add additional properties files. If `PostfixMathCommand.setDescription(String)` has been called, return the description set by that method instead.
    Specified by:
      `getDescription` in interface `PostfixMathCommandI`
    Overrides:
      `getDescription` in class `PostfixMathCommand`
    Returns:
      the description of the function