import type { CreateExpression } from "../factories/expression";
import type { BooleanExpression } from "./boolean";
import type { DateExpression } from "./date";
import type { EnumExpression } from "./enum";
import type { NumberExpression } from "./number";
import type { ObjectExpression } from "./object";
import type { StringExpression } from "./string";
import type { UnionExpression } from "./union";

type TupleBaseItemExpression =
  | StringExpression
  | NumberExpression
  | BooleanExpression
  | DateExpression
  | EnumExpression
  | ObjectExpression;

type TupleItemExpression =
  | TupleBaseItemExpression
  | UnionExpression<TupleBaseItemExpression>
  | TupleExpression<TupleBaseItemExpression | UnionExpression<TupleBaseItemExpression>>;

export type TupleExpression<Item = TupleItemExpression> = readonly [CreateExpression<"tuple">, ...(readonly Item[])];
