import type ts from 'typescript';
export interface TopValue {
    readonly kind: 'top';
}
export interface ConstantValue {
    readonly kind: 'constant';
    readonly value: unknown;
}
export interface BottomValue {
    readonly kind: 'bottom';
    /** Human-readable reason this value is not constant. */
    readonly reason: string;
    /** The original expression node that caused the Bottom. */
    readonly sourceNode?: ts.Node;
    /** Root-cause Bottom for poisoned-value chains. */
    readonly rootCause?: BottomValue;
    /** True when wrapped in Steps.safeVar() — produces warning instead of error. */
    readonly isSafe?: boolean;
}
export type LatticeValue = TopValue | ConstantValue | BottomValue;
export declare function top(): TopValue;
export declare function constant(value: unknown): ConstantValue;
export declare function bottom(reason: string, sourceNode?: ts.Node, rootCause?: BottomValue): BottomValue;
export declare function safeBottom(reason: string, sourceNode?: ts.Node, rootCause?: BottomValue): BottomValue;
/**
 * Propagate a Bottom through a dependency chain.
 * The new Bottom inherits the root cause from the original.
 */
export declare function propagateBottom(reason: string, source: BottomValue, sourceNode?: ts.Node): BottomValue;
/**
 * The meet (⊓) combines two lattice values:
 *   ⊤ ⊓ x = x
 *   x ⊓ ⊤ = x
 *   ⊥ ⊓ x = ⊥
 *   x ⊓ ⊥ = ⊥
 *   Constant(a) ⊓ Constant(b) = Constant(a) if a === b, else ⊥
 */
export declare function meet(a: LatticeValue, b: LatticeValue): LatticeValue;
export declare function isTop(v: LatticeValue): v is TopValue;
export declare function isConstant(v: LatticeValue): v is ConstantValue;
export declare function isBottom(v: LatticeValue): v is BottomValue;
//# sourceMappingURL=lattice.d.ts.map