// Path: jmespath-core/src/main/java/io/burt/jmespath/Expression.java
// public interface Expression<T> {
//   /**
//    * Evaluate this expression against a JSON-like structure and return the result.
//    */
//   T search(T input);
// }


import io.burt.jmespath.Expression;
package io.burt.jmespath.function;


/**
 * In JMESPath most functions take regular values as arguments, but some are
 * higher order functions and take expressions. This class exists so that
 * argument lists can have a single type, while still contain a mix of values
 * and expressions.
 */
public abstract class FunctionArgument<T> {
  private static class V<U> extends FunctionArgument<U> {
    private final U value;

    public V(U value) {
      this.value = value;
    }

    @Override
    public U value() { return value; }

    @Override
    public boolean isValue() { return true; }
  }

  private static class E<U> extends FunctionArgument<U> {
// Path: jmespath-core/src/main/java/io/burt/jmespath/Expression.java
// public interface Expression<T> {
//   /**
//    * Evaluate this expression against a JSON-like structure and return the result.
//    */
//   T search(T input);
// }


// Path: jmespath-core/src/main/java/io/burt/jmespath/function/FunctionArgument.java
import io.burt.jmespath.Expression;

package io.burt.jmespath.function;


/**
 * In JMESPath most functions take regular values as arguments, but some are
 * higher order functions and take expressions. This class exists so that
 * argument lists can have a single type, while still contain a mix of values
 * and expressions.
 */
public abstract class FunctionArgument<T> {
  private static class V<U> extends FunctionArgument<U> {
    private final U value;

    public V(U value) {
      this.value = value;
    }

    @Override
    public U value() { return value; }

    @Override
    public boolean isValue() { return true; }
  }

  private static class E<U> extends FunctionArgument<U> {
    private final Expression<U> expression;