import { types as t } from "@marko/compiler";
import { type AccessorPrefix, AccessorProp } from "../../common/types";
import { type Opt } from "./optional";
import { type Binding, type Getter, type ReferencedBindings } from "./references";
import { type Section } from "./sections";
export interface Signal {
    identifier: t.Identifier;
    referencedBindings: ReferencedBindings;
    section: Section;
    build: undefined | (() => t.Expression | undefined);
    register?: boolean;
    values: Array<{
        signal: Signal;
        value: t.Expression;
    }>;
    intersection: Opt<Signal>;
    render: t.Statement[];
    renderReferencedBindings: ReferencedBindings;
    effect: t.Statement[];
    effectReferencedBindings: ReferencedBindings;
    hasDynamicSubscribers: boolean;
    hasSideEffect: boolean;
    export: boolean;
    extraArgs: t.Expression[] | undefined;
    prependStatements: t.Statement[] | undefined;
    buildAssignment: ((valueSection: Section, value: t.Expression) => t.Expression | undefined) | undefined;
}
type closureSignalBuilder = (closure: Binding, render: t.Expression) => t.Expression;
export declare function setClosureSignalBuilder(tag: t.NodePath<t.MarkoTag>, builder: closureSignalBuilder): void;
export declare const getTryHasPlaceholder: (section: Section) => true | undefined, setTryHasPlaceholder: (section: Section, value: true | undefined) => void;
export declare function setSectionSerializedValue(section: Section, prop: AccessorProp, expression: t.Expression): void;
export declare function setBindingSerializedValue(section: Section, binding: Binding, expression: t.Expression, prefix?: AccessorPrefix): void;
export declare function setSerializedValue(section: Section, key: string, expression: t.Expression): void;
export declare function addWriteScopeBuilder(section: Section, builder: (writeCall: t.Expression) => t.Expression): void;
export declare const getHTMLSectionStatements: (section: Section) => t.Statement[];
export declare function getBindingGetterIdentifier(binding: Binding, getterSection: Getter["hoisted"]): t.Identifier;
export declare function getSignal(section: Section, referencedBindings: ReferencedBindings, name?: string): Signal;
export declare function initValue(binding: Binding, isLet?: boolean): Signal;
export declare function signalHasStatements(signal: Signal): boolean;
export declare function getSignalFn(signal: Signal): t.Expression;
export declare function getSignalValueIdentifier(signal: Signal): t.Identifier;
export declare function replaceNullishAndEmptyFunctionsWith0(args: (t.Expression | undefined | false)[]): t.Expression[];
export declare function addStatement(type: "render" | "effect", targetSection: Section, referencedBindings: ReferencedBindings, statement: t.Statement | t.Statement[], usedReferences?: ReferencedBindings[] | false, isPure?: boolean): void;
export declare function addValue(targetSection: Section, referencedBindings: ReferencedBindings, signal: Signal, value: t.Expression): void;
export declare function getResumeRegisterId(section: Section, referencedBindings: string | ReferencedBindings, type?: string): string;
export declare function writeSignals(section: Section): Set<Signal>;
export declare function writeRegisteredFns(): void;
export declare function addHTMLEffectCall(section: Section, referencedBindings?: ReferencedBindings): void;
export declare function writeHTMLResumeStatements(path: t.NodePath<t.MarkoTagBody | t.Program>): void;
export declare function getSetup(section: Section): Signal | undefined;
export declare function replaceRegisteredFunctionNode(node: t.Node): t.CallExpression | t.ClassPrivateProperty | t.ClassProperty | t.Identifier | t.ObjectProperty | t.VariableDeclaration | undefined;
export {};
