de.caff.generics.function

## Interface VarDoubleOperator

- Functional Interface:
    This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.

      @FunctionalInterface
      public interface VarDoubleOperator

  Primitive double operator with a variable number of arguments.

  Although this basically works for a variable double array via the `apply(double...)` method implementors have to implement the method `apply(DoubleIndexable)` with a `DoubleIndexable` argument. This is done to make this class generally more useful without the need to copy arrays.

  An example using the `maxOp` operator defined in the documentation of `fromBinary(DoubleBinaryOperator, double)` should illustrate this (with `Point2D` arguments):

  >      double maxX = maxOp.apply(DoubleIndexable.viewArray(Point2D::getX,
  >                                                          p1, p2, p3, p4));

  Since:
    November 03, 2020
  Author:
    Rammi

- - ### Method Summary

    All Methods Static Methods Instance Methods Abstract Methods Default Methods
    Modifier and Type | Method and Description
    --- | ---
    `default double` | `apply(double... values)` Apply this operator.
    `double` | `apply(DoubleIndexable values)` Apply this operator.
    `static VarDoubleOperator` | `fromBinary(java.util.function.DoubleBinaryOperator binaryOp, double startValue)` Create an variable args operator from applying a binary operator over and over.

- - ### Method Detail

    - #### apply

          default double apply(double... values)

      Apply this operator. This default method forwards execution to `apply(DoubleIndexable)`.
      Parameters:
        `values` - arguments on which this operator is applied
      Returns:
        result of applying this operator to all arguments

    - #### apply

          double apply(@NotNull
                       DoubleIndexable values)

      Apply this operator.
      Parameters:
        `values` - indexable providing the values on which this operator operates
      Returns:
        result of applying this operator to all values

    - #### fromBinary

          @NotNull
          static VarDoubleOperator fromBinary(@NotNull
                                                       java.util.function.DoubleBinaryOperator binaryOp,
                                                       double startValue)

      Create an variable args operator from applying a binary operator over and over.

      Eg

      >      VarDoubleOperator maxOp = VarDoubleOperator.fromBinary(Math::max, Double.NEGATIVE_INFINITY);
      >      double max = maxOp.apply(1, -7, Math.PI, Math.atan(17));

      On each application the currently accumulated result becomes the left (first) argument of `binaryOp`, while the run value becomes the right (second).
      Parameters:
        `binaryOp` - binary operator
        `startValue` - start value (result of operator if no values are given)
      Returns:
        variable double argument operator which applies the given binary operator over and over