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 { TupleExpression } from "./tuple";

type UnionBaseItemExpression =
  | StringExpression
  | NumberExpression
  | BooleanExpression
  | DateExpression
  | EnumExpression
  | ObjectExpression;

type UnionItemExpression =
  | UnionBaseItemExpression
  | TupleExpression<UnionBaseItemExpression>
  | UnionExpression<UnionBaseItemExpression | TupleExpression<UnionBaseItemExpression>>;

export type UnionExpression<Item = UnionItemExpression> = readonly [CreateExpression<"union">, ...(readonly Item[])];
