import { NodeTypes } from '../../constants/constants'; import type { AstNode, BindingTarget } from '../types'; import type { ParserContext } from '../ParserContext'; /** * Parsed handler clause — effect name, parameter bindings, and body expressions. */ export interface ParsedHandlerClause { effectName: string; params: BindingTarget[]; body: AstNode[]; } /** * HandlerNode: ["Handler", [clauses, transform], nodeId] * - clauses: array of { effectName, params, body } parsed clause descriptors * - transform: [paramBindingTarget, bodyExprs] | null * * The handler value is created at evaluation time from this AST node. */ export type HandlerNode = [typeof NodeTypes.Handler, [ParsedHandlerClause[], [BindingTarget, AstNode[]] | null, boolean], number]; /** * Parse `handler [transform x -> expr] end`. * * `handler` and `transform` are contextual keywords (regular symbols), * not reserved words — they can be used as variable names elsewhere. * `end` is a reserved keyword as usual. * * Clauses: `@effect(params...) -> expr` — the `@effect` token starts each clause. * No separators between clauses (like match cases). * Duplicate effect names are a parse error. * Transform: optional, `transform x -> expr` (or `transform x -> do...end`). */ export declare function parseHandler(ctx: ParserContext, shallow?: boolean): HandlerNode;