import * as Tiny from '../../index';
export declare type LangObject = NumberObject | StringObject | BooleanObject | ArrayObject | ObjectObject | FunctionObject | BuiltinFunction | ReturnValue | ErrorObject | Null | Undefined | null;
export declare const enum ObjectKind {
    NUMBER = 300,
    STRING = 301,
    BOOLEAN = 302,
    ARRAY = 303,
    OBJECT = 304,
    FUNCTION = 305,
    BUILTIN = 306,
    RETURN_VALUE = 307,
    ERROR = 308,
    NULL = 309,
    UNDEFINED = 310,
    DECORATOR = 311
}
export declare const objectStringify: (obj: LangObject, strW?: boolean) => string;
export declare const objectKindStringify: (kind: ObjectKind) => string;
export interface NumberObject {
    value: number;
    kind: ObjectKind.NUMBER;
}
export interface BooleanObject {
    value: boolean;
    kind: ObjectKind.BOOLEAN;
}
export interface StringObject {
    value: string;
    kind: ObjectKind.STRING;
}
export interface ArrayObject {
    value: Array<LangObject>;
    kind: ObjectKind.ARRAY;
}
export interface ObjectObject {
    pairs: Map<NumberObject | StringObject, LangObject>;
    kind: ObjectKind.OBJECT;
}
export interface FunctionObject {
    function: Tiny.Expression;
    parameters: Array<Tiny.Expression>;
    decorator?: ObjectObject;
    body: Tiny.Expression;
    enviroment: Tiny.Enviroment;
    option: Tiny.Options;
    kind: ObjectKind.FUNCTION;
}
export interface BuiltinFunction {
    func: BuiltinFunctionType;
    kind: ObjectKind.BUILTIN;
}
export declare type BuiltinFunctionType = (parameters: Array<LangObject>, enviroment: Tiny.Enviroment, evaluator: Tiny.Evaluator, position: Tiny.Position) => LangObject;
export interface ReturnValue {
    value: LangObject;
    kind: ObjectKind.RETURN_VALUE;
}
export interface ErrorObject {
    message: string;
    kind: ObjectKind.ERROR;
    line: number;
    column: number;
}
export interface Null {
    kind: ObjectKind.NULL;
}
export interface Undefined {
    kind: ObjectKind.UNDEFINED;
}
