// 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/Function.java
// public interface Function {
//   /**
//    * Returns the name of the function.
//    * <p>
//    * The name is either automatically generated from the class name, or
//    * explicitly specified in the constructor.
//    */
//   String name();
// 
//   /**
//    * Returns the constraints to use when checking the list of arguments before
//    * the function is called.
//    */
//   ArgumentConstraint argumentConstraints();
// 
//   /**
//    * Call this function with a list of arguments.
//    * <p>
//    * The arguments can be either values or expressions, and their types will be
//    * checked before proceeding with the call.
//    *
//    * @throws ArgumentTypeException when the function is called with arguments of the wrong type
//    * @throws ArityException when the function is called with the wrong number of arguments
//    */
//   <T> T call(Adapter<T> runtime, List<FunctionArgument<T>> arguments);
// }


import java.util.List;
import io.burt.jmespath.Expression;
import io.burt.jmespath.function.Function;
package io.burt.jmespath.node;



/**
 * A node factory is used by the expression compiler to create AST nodes.
 */
public interface NodeFactory<T> {
  Node<T> createCurrent();

  Node<T> createProperty(String name);

  Node<T> createIndex(int index);

  Node<T> createSlice(Integer start, Integer stop, Integer step);

  Node<T> createProjection(Expression<T> expression);

  Node<T> createFlattenArray();

  Node<T> createFlattenObject();

  Node<T> createSelection(Expression<T> test);

  Node<T> createComparison(Operator operator, Expression<T> left, Expression<T> right);

// 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/Function.java
// public interface Function {
//   /**
//    * Returns the name of the function.
//    * <p>
//    * The name is either automatically generated from the class name, or
//    * explicitly specified in the constructor.
//    */
//   String name();
// 
//   /**
//    * Returns the constraints to use when checking the list of arguments before
//    * the function is called.
//    */
//   ArgumentConstraint argumentConstraints();
// 
//   /**
//    * Call this function with a list of arguments.
//    * <p>
//    * The arguments can be either values or expressions, and their types will be
//    * checked before proceeding with the call.
//    *
//    * @throws ArgumentTypeException when the function is called with arguments of the wrong type
//    * @throws ArityException when the function is called with the wrong number of arguments
//    */
//   <T> T call(Adapter<T> runtime, List<FunctionArgument<T>> arguments);
// }


// Path: jmespath-core/src/main/java/io/burt/jmespath/node/NodeFactory.java
import java.util.List;
import io.burt.jmespath.Expression;
import io.burt.jmespath.function.Function;

package io.burt.jmespath.node;



/**
 * A node factory is used by the expression compiler to create AST nodes.
 */
public interface NodeFactory<T> {
  Node<T> createCurrent();

  Node<T> createProperty(String name);

  Node<T> createIndex(int index);

  Node<T> createSlice(Integer start, Integer stop, Integer step);

  Node<T> createProjection(Expression<T> expression);

  Node<T> createFlattenArray();

  Node<T> createFlattenObject();

  Node<T> createSelection(Expression<T> test);

  Node<T> createComparison(Operator operator, Expression<T> left, Expression<T> right);

  Node<T> createOr(Expression<T> left, Expression<T> right);