import type { PendingRender } from "../dom/queue";
import type { Renderer as ClientRenderer, Renderer } from "../dom/renderer";
import type { AccessorProp } from "./accessor.debug";
import * as ControlledType from "./constants/controlled-type";
import * as NodeType from "./constants/node-type";
import * as ResumeSymbol from "./constants/resume-symbol";
import * as WalkCode from "./constants/walk-code";
import * as WalkRangeSize from "./constants/walk-range-size";
export type Falsy = undefined | null | false | 0 | "";
export interface BranchScope extends Scope {
    [AccessorProp.StartNode]: ChildNode;
    [AccessorProp.EndNode]: ChildNode;
    [AccessorProp.ParentBranch]: BranchScope | undefined;
    [AccessorProp.AbortScopes]: Set<Scope> | undefined;
    [AccessorProp.BranchScopes]: Set<BranchScope> | undefined;
    [AccessorProp.Renderer]: ClientRenderer | string;
    [AccessorProp.AwaitCounter]: AwaitCounter | undefined;
    [AccessorProp.PendingEffects]: unknown[] | undefined;
    [AccessorProp.PlaceholderBranch]: BranchScope | undefined | 0;
    [AccessorProp.PendingRenders]: PendingRender[] | 0 | undefined;
    [AccessorProp.DetachedAwait]: Renderer | 0 | undefined;
    [AccessorProp.PendingScopes]: Scope[] | void;
}
export interface Scope {
    [AccessorProp.Owner]: Scope | undefined;
    [AccessorProp.Global]: Record<string, unknown>;
    [AccessorProp.Id]: number;
    [AccessorProp.Gen]: number;
    [AccessorProp.AbortControllers]: Record<string | number, AbortController | void> | undefined;
    [AccessorProp.ClosestBranch]: BranchScope | undefined;
    [AccessorProp.ClosestBranchId]: number | undefined;
    [AccessorProp.Subscriptions]: Set<Scope>[] | undefined;
    [x: `___${string}`]: never;
    [x: string | number]: any;
}
type ResumeSymbol = ResumeSymbol.Value;
export { ResumeSymbol };
export interface AwaitCounter {
    m?: (effects: unknown[]) => unknown[];
    i: number;
    c: () => void | 1;
}
export { AccessorPrefix, AccessorProp, ClosureSignalProp, KeyedScopesProp, PendingRenderProp, RendererProp, } from "./accessor.debug";
type NodeType = NodeType.Value;
export { NodeType };
type WalkCode = WalkCode.Value;
export { WalkCode };
type WalkRangeSize = WalkRangeSize.Value;
export { WalkRangeSize };
export type Accessor = string;
export type EncodedAccessor = number | string;
export interface $Global {
    [x: PropertyKey]: unknown;
    signal?: AbortSignal;
    cspNonce?: string;
    renderId?: string;
    runtimeId?: string;
}
export interface Input {
    [x: PropertyKey]: unknown;
}
export interface TemplateInput extends Input {
    $global?: $Global;
}
export interface Template {
    mount(input: Input, reference: Node, position?: InsertPosition): MountedTemplate;
    render(input?: Input): RenderedTemplate;
}
export interface MountedTemplate {
    value: unknown;
    update(input: unknown): void;
    destroy(): void;
}
export type RenderedTemplate = PromiseLike<string> & AsyncIterable<string> & {
    toReadable(): ReadableStream<Uint8Array<ArrayBufferLike>>;
};
type ControlledType = ControlledType.Value;
export { ControlledType };
