		}
		node.traverseApply =
			compiledTraversals[`${node.id}Apply`].bind(compiledTraversals)

		if (compiledTraversals[`${node.id}Optimistic`]) {
			;(node as UnionNode).traverseOptimistic =
				compiledTraversals[`${node.id}Optimistic`].bind(compiledTraversals)
		}
		node.precompilation = precompilation
	}
}

export type PrecompiledReferences = {
	[k: `${string}Allows`]: TraverseAllows
	[k: `${string}Apply`]: TraverseApply
	[k: `${string}Optimistic`]: (data: unknown) => unknown
}

const precompileReferences = (references: readonly BaseNode[]) =>
	new CompiledFunction<() => PrecompiledReferences>().return(
		references.reduce((js, node) => {
			const allowsCompiler = new NodeCompiler({ kind: "Allows" }).indent()
			node.compile(allowsCompiler)
			const allowsJs = allowsCompiler.write(`${node.id}Allows`)

			const applyCompiler = new NodeCompiler({ kind: "Apply" }).indent()
			node.compile(applyCompiler)
			const applyJs = applyCompiler.write(`${node.id}Apply`)

			const result = `${js}${allowsJs},\n${applyJs},\n`

