/**
 * Visitor pattern implementation for TAML AST
 */
import type { DocumentNode, ElementNode, TamlNode, TextNode } from "./nodes.js";
/**
 * Visitor interface for traversing and processing AST nodes
 */
export interface Visitor {
    /** Called when visiting a document node */
    visitDocument?(node: DocumentNode): void;
    /** Called when visiting an element node */
    visitElement?(node: ElementNode): void;
    /** Called when visiting a text node */
    visitText?(node: TextNode): void;
    /** Called before visiting children (pre-order) */
    enterNode?(node: TamlNode): void;
    /** Called after visiting children (post-order) */
    exitNode?(node: TamlNode): void;
}
/**
 * Transformer interface for converting AST nodes to other types
 */
export interface Transformer<T = TamlNode> {
    /** Transform a document node */
    visitDocument?(node: DocumentNode): T;
    /** Transform an element node */
    visitElement?(node: ElementNode): T;
    /** Transform a text node */
    visitText?(node: TextNode): T;
}
/**
 * Visit an AST node and its children using the visitor pattern
 */
export declare function visit(node: TamlNode, visitor: Visitor): void;
/**
 * Transform an AST node using the transformer pattern
 */
export declare function transform<T>(node: TamlNode, transformer: Transformer<T>): T;
/**
 * Visit nodes asynchronously
 */
export declare function visitAsync(node: TamlNode, visitor: AsyncVisitor): Promise<void>;
/**
 * Async visitor interface
 */
export interface AsyncVisitor {
    /** Called when visiting a document node */
    visitDocument?(node: DocumentNode): Promise<void>;
    /** Called when visiting an element node */
    visitElement?(node: ElementNode): Promise<void>;
    /** Called when visiting a text node */
    visitText?(node: TextNode): Promise<void>;
    /** Called before visiting children (pre-order) */
    enterNode?(node: TamlNode): Promise<void>;
    /** Called after visiting children (post-order) */
    exitNode?(node: TamlNode): Promise<void>;
}
/**
 * Create a visitor that only visits specific node types
 */
export declare function createTypedVisitor<T extends TamlNode>(nodeTest: (node: TamlNode) => node is T, callback: (node: T) => void): Visitor;
/**
 * Create a visitor that collects nodes of a specific type
 */
export declare function createCollectorVisitor<T extends TamlNode>(nodeTest: (node: TamlNode) => node is T): Visitor & {
    nodes: T[];
};
/**
 * Create a visitor that counts nodes by type
 */
export declare function createCounterVisitor(): Visitor & {
    counts: {
        document: number;
        element: number;
        text: number;
    };
};
//# sourceMappingURL=visitor.d.ts.map