// Generated by dts-bundle v0.7.3

declare const EQ: "==";
declare const NEQ: "!=";
declare const LE: "<=";
declare const GE: ">=";
declare const LT: "<";
declare const GT: ">";
declare const IN: "=in=";
declare const OUT: "=out=";
declare const LE_VERBOSE: "=le=";
declare const GE_VERBOSE: "=ge=";
declare const LT_VERBOSE: "=lt=";
declare const GT_VERBOSE: "=gt=";
declare type CustomComparisonOperator = string;
declare const CanonicalComparisonOperators: ("==" | "!=" | "<=" | ">=" | "<" | ">" | "=in=" | "=out=")[];
declare type CanonicalComparisonOperator = typeof CanonicalComparisonOperators[number];
declare const VerboseComparisonOperators: ("=le=" | "=ge=" | "=lt=" | "=gt=")[];
declare type VerboseComparisonOperator = typeof VerboseComparisonOperators[number];
declare const ComparisonOperators: (
  | "=="
  | "!="
  | "<="
  | ">="
  | "<"
  | ">"
  | "=in="
  | "=out="
  | "=le="
  | "=ge="
  | "=lt="
  | "=gt="
)[];
declare type ComparisonOperator = typeof ComparisonOperators[number] | CustomComparisonOperator;
declare function isComparisonOperator(
  candidate: string,
  operator?: ComparisonOperator
): candidate is ComparisonOperator;
export {
  EQ,
  NEQ,
  LE,
  GE,
  LT,
  GT,
  IN,
  OUT,
  LE_VERBOSE,
  GE_VERBOSE,
  LT_VERBOSE,
  GT_VERBOSE,
  ComparisonOperators,
  CanonicalComparisonOperators,
  VerboseComparisonOperators,
  isComparisonOperator,
  ComparisonOperator,
  CanonicalComparisonOperator,
  VerboseComparisonOperator,
};

declare const AND: ";";
declare const OR: ",";
declare const AND_VERBOSE: "and";
declare const OR_VERBOSE: "or";
declare const CanonicalLogicOperators: (";" | ",")[];
declare type CanonicalLogicOperator = typeof CanonicalLogicOperators[number];
declare const VerboseLogicOperators: ("and" | "or")[];
declare type VerboseLogicOperator = typeof VerboseLogicOperators[number];
declare const LogicOperators: (";" | "," | "and" | "or")[];
declare type LogicOperator = typeof LogicOperators[number];
declare function isLogicOperator(candidate: string, operator?: LogicOperator): candidate is LogicOperator;
export {
  AND,
  OR,
  AND_VERBOSE,
  OR_VERBOSE,
  CanonicalLogicOperators,
  VerboseLogicOperators,
  LogicOperators,
  isLogicOperator,
  CanonicalLogicOperator,
  VerboseLogicOperator,
  LogicOperator,
};

declare const ReservedChars: readonly ['"', "'", "(", ")", ";", ",", "=", "!", "~", "<", ">", " ", "\n", "\t", "\r"];
declare type ReservedChar = typeof ReservedChars[number];
export { ReservedChars, ReservedChar };

declare const NodeType: {
  readonly SELECTOR: "SELECTOR";
  readonly VALUE: "VALUE";
  readonly COMPARISON: "COMPARISON";
  readonly LOGIC: "LOGIC";
};
interface Node<TType = string> {
  readonly type: TType;
}
interface SelectorNode extends Node<typeof NodeType.SELECTOR> {
  readonly selector: string;
}
interface ValueNode extends Node<typeof NodeType.VALUE> {
  readonly value: string | string[];
}
interface BinaryNode<
  TType extends string = string,
  TLeft extends Node = Node,
  TOperator extends string = string,
  TRight extends Node = Node
> extends Node<TType> {
  readonly left: TLeft;
  readonly operator: TOperator;
  readonly right: TRight;
}
declare type ComparisonNode = BinaryNode<typeof NodeType.COMPARISON, SelectorNode, ComparisonOperator, ValueNode>;
declare type LogicNode = BinaryNode<typeof NodeType.LOGIC, ExpressionNode, LogicOperator, ExpressionNode>;
declare type ExpressionNode = ComparisonNode | LogicNode;
declare function createSelectorNode(selector: string, skipChecks?: boolean): SelectorNode;
declare function createValueNode(value: string | string[], skipChecks?: boolean): ValueNode;
declare function createComparisonNode(
  selector: SelectorNode,
  operator: ComparisonOperator,
  value: ValueNode,
  skipChecks?: boolean
): ComparisonNode;
declare function createLogicNode(
  left: ExpressionNode,
  operator: LogicOperator,
  right: ExpressionNode,
  skipChecks?: boolean
): LogicNode;
declare function isNode(candidate: unknown): candidate is Node;
declare function isSelectorNode(candidate: unknown): candidate is SelectorNode;
declare function isValueNode(candidate: unknown): candidate is ValueNode;
declare function isComparisonNode(candidate: unknown, operator?: ComparisonOperator): candidate is ComparisonNode;
declare function isLogicNode(candidate: unknown, operator?: LogicOperator): candidate is LogicNode;
declare function isExpressionNode(candidate: unknown): candidate is ExpressionNode;
declare function getSelector(comparison: ComparisonNode): string;
declare function getValue(comparison: ComparisonNode): string | string[];
declare function getSingleValue(comparison: ComparisonNode): string;
declare function getMultiValue(comparison: ComparisonNode): string[];
export {
  createSelectorNode,
  createValueNode,
  createComparisonNode,
  createLogicNode,
  isNode,
  isSelectorNode,
  isValueNode,
  isComparisonNode,
  isLogicNode,
  isExpressionNode,
  getSelector,
  getValue,
  getSingleValue,
  getMultiValue,
  Node,
  SelectorNode,
  ValueNode,
  BinaryNode,
  ComparisonNode,
  LogicNode,
  ExpressionNode,
};
