export type Expr = | ArrayIndex | Identifier | NumberLiteral | OperatorExpr | NameRef | PropRef | ValueRef; // export interface NameRef { kind: "name-ref"; name: Name; } export interface ValueRef { kind: "value-ref"; name: Name; } export interface Identifier { kind: "identifier"; name: I; } export interface NumberLiteral { kind: "index"; number: N; } export interface PropRef { kind: "prop-ref"; expr: Ex; name: Id; } export interface ArrayIndex< List extends Expr = any, Number extends NumberLiteral | ValueRef = NumberLiteral | ValueRef, > { kind: "array-index"; list: List; number: Number; } export type Operator = "and" | "or" | "=" | "<" | "<=" | ">=" | ">"; export interface OperatorExpr< Left extends Expr = any, Op extends Operator = Operator, Right extends Expr = any, > { kind: "op"; left: Left; op: Op; right: Right; } export type LowercaseLetter = | "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z"; export type UppercaseLetter = Uppercase; export type Letter = LowercaseLetter | UppercaseLetter; export type Digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"; export type SpecialCharacter = "_"; export type Word = Digit | Letter | SpecialCharacter;