import { type Environment } from "./env";
import { type EvaluatorContext } from "./evaluator/context";
import { type Expr } from "./expr";
import type { FunctionValue } from "./function-value";
import type { TypeValue } from "./type-value";
import type { ArrayType, ComptimeListType, EnumType, ExprType, PtrType, StructType, TraitType, TupleType, Type } from "./types/definitions";
import type { UnitValue } from "./unit-value";
import { ValueTag } from "./value-tag";
export type ComptimeStringValue = {
    tag: ValueTag.ComptimeString;
    type: Type;
    value: string;
};
export type NumberValue = {
    tag: ValueTag.ComptimeInt | ValueTag.ComptimeFloat | ValueTag.U8 | ValueTag.I8 | ValueTag.U16 | ValueTag.I16 | ValueTag.U32 | ValueTag.I32 | ValueTag.U64 | ValueTag.I64 | ValueTag.F32 | ValueTag.F64 | ValueTag.Usize | ValueTag.Isize;
    type: Type;
    value: number | bigint;
};
export type BooleanValue = {
    tag: ValueTag.Bool;
    type: Type;
    value: boolean;
};
export type TupleValue = {
    tag: ValueTag.Tuple;
    type: TupleType;
    fields: Value[];
};
export type StructValue = {
    tag: ValueTag.Struct;
    type: StructType;
    fields: (Value | undefined)[];
    moduleLevelInitExprs?: Expr[];
    isLoading?: boolean;
};
export type EnumValue = {
    tag: ValueTag.Enum;
    type: EnumType;
    variantName: string;
    fields: Value[];
};
export type TraitValue = {
    tag: ValueTag.Trait;
    type: TraitType;
    fields: (Value | undefined)[];
};
export type ArrayValue = {
    tag: ValueTag.Array;
    type: ArrayType;
    elements: Value[];
};
export type ExprValue = {
    tag: ValueTag.Expr;
    type: ExprType;
    value: Expr;
};
export type ComptimeListValue = {
    tag: ValueTag.ComptimeList;
    type: ComptimeListType;
    elements: Value[];
};
export type UnknownValue = {
    tag: ValueTag.Unknown;
    type: Type;
    variableName?: string;
    isRuntimeOnly?: boolean;
    resolvedFuncValueId?: string;
};
export type PtrValue = {
    tag: ValueTag.Ptr;
    type: PtrType;
    targetValue: [Value];
    targetIndex: number;
};
export type Value = TypeValue | ComptimeStringValue | ComptimeListValue | NumberValue | UnitValue | BooleanValue | ArrayValue | TupleValue | StructValue | EnumValue | TraitValue | FunctionValue | ExprValue | UnknownValue | PtrValue;
export declare function valueToString(value?: Value): string;
export declare function isTypeValue(value?: Value): value is TypeValue;
export declare function isComptimeIntValue(value?: Value): value is NumberValue;
export declare function isComptimeFloatValue(value?: Value): value is NumberValue;
export declare function isComptimeStringValue(value?: Value): value is ComptimeStringValue;
export declare function isComptimeListValue(value?: Value): value is ComptimeListValue;
export declare function isExprListValue(value?: Value): value is ComptimeListValue;
export declare function isNumberValue(value?: Value): value is NumberValue;
export declare function isBooleanValue(value?: Value): value is BooleanValue;
export declare function isFunctionValue(value?: Value): value is FunctionValue;
export declare function isUnknownValue(value?: Value): value is UnknownValue;
export declare function isTupleValue(value?: Value): value is TupleValue;
export declare function isStructValue(value?: Value): value is StructValue;
export declare function isArrayValue(value?: Value): value is ArrayValue;
export declare function isEnumValue(value?: Value): value is EnumValue;
export declare function isTraitValue(value?: Value): value is TraitValue;
export declare function isPtrValue(value?: Value): value is PtrValue;
export declare function isRegionValue(_value?: Value): boolean;
export declare function isExprValue(value?: Value): value is ExprValue;
export declare function createTypeValue(value: Type): TypeValue;
export declare function createComptimeStringValue(value: string): ComptimeStringValue;
export declare function createComptimeListValue(childType: Type, elements: Value[]): ComptimeListValue;
export declare function createNumberValue(tag: NumberValue["tag"], value: number | bigint): {
    tag: ValueTag.ComptimeInt | ValueTag.ComptimeFloat | ValueTag.U8 | ValueTag.I8 | ValueTag.U16 | ValueTag.I16 | ValueTag.U32 | ValueTag.I32 | ValueTag.U64 | ValueTag.I64 | ValueTag.F32 | ValueTag.F64 | ValueTag.Usize | ValueTag.Isize;
    type: Type;
    value: number | bigint;
};
export declare function createComptimeIntValue(value: bigint): NumberValue;
export declare function createComptimeFloatValue(value: number): NumberValue;
export declare function createBooleanValue(value: boolean): BooleanValue;
export declare function createUnknownValue(type: Type, { variableName, recursiveTypeRef, env, context, }: {
    variableName?: string;
    recursiveTypeRef?: {
        functionValue: FunctionValue;
        argValues: Value[];
    };
    env: Environment;
    context: EvaluatorContext;
}): UnknownValue | TypeValue;
export declare function createStructValue(type: StructType, fields: (Value | undefined)[], moduleLevelInitExprs?: Expr[]): StructValue;
export declare function createTraitValue(type: TraitType, fields: (Value | undefined)[]): TraitValue;
export declare function createTupleValue(type: TupleType, fields: Value[]): TupleValue;
export declare function createEnumValue(type: EnumType, variantName: string, fields: Value[]): EnumValue;
export declare function createArrayValue(type: ArrayType, elements: Value[]): ArrayValue;
export declare function createExprValue(expr: Expr): ExprValue;
export declare function createPtrValue(type: PtrType, targetValue: [Value], targetIndex?: number): PtrValue;
export declare function areValuesEqual(expected: {
    value: Value | undefined;
    env: Environment;
}, given: {
    value: Value | undefined;
    env: Environment;
}): boolean;
