import { ReferenceType } from "./reference_type";
import { TimeUnit } from "../utils/date_time/time_unit";
import { Variable } from "./variable";
import { Context } from "./context";
export declare enum ValueType {
    Null = "Null",
    Bool = "Bool",
    Number = "Number",
    Quoted = "Quoted",
    RelativeDate = "RelativeDate",
    Date = "Date",
    List = "List",
    Function = "Function",
    Token = "Token",
    Reference = "Reference",
    Subquery = "Subquery"
}
export declare abstract class Value<T extends ValueType = ValueType, V = unknown> {
    type: T;
    value: V;
    constructor(type: T, value: V);
    eq(other: Value): boolean;
}
export declare namespace Value {
    class Null extends Value<ValueType.Null, null> {
        constructor();
        toString(): string;
    }
    class Bool extends Value<ValueType.Bool, boolean> {
        constructor(value: boolean);
        toString(): string;
    }
    class Number extends Value<ValueType.Number, number> {
        constructor(value: number);
        toString(): string;
    }
    class Quoted extends Value<ValueType.Quoted, string> {
        constructor(value: string);
        toString(): string;
    }
    class RelativeDate extends Value<ValueType.RelativeDate, number> {
        unit: TimeUnit;
        constructor(value: number, unit: TimeUnit);
        toString(): string;
        eq(other: Value): boolean;
    }
    class Date extends Value<ValueType.Date, string> {
        constructor(value: string);
        toString(): string;
    }
    class List extends Value<ValueType.List, Value[]> {
        constructor(value: Value[]);
        toString(): string;
    }
    class Function extends Value<ValueType.Function, string> {
        args: string[];
        constructor(value: string, args: string[]);
        toString(): string;
        eq(other: Value): boolean;
    }
    class Token extends Value<ValueType.Token, string> {
        constructor(value: string);
        toString(): string;
        eq(other: Value): boolean;
    }
    class Reference extends Value<ValueType.Reference, string> {
        referenceType: ReferenceType;
        constructor(referenceType: ReferenceType, value: string);
        toString(): string;
        eq(other: Value): boolean;
    }
    class Subquery extends Value<ValueType.Subquery, string> {
        variable: Variable;
        context: Context;
        constructor(value: string, variable: Variable, context: Context);
        toString(): string;
    }
}
