import { Component } from "./component.js"; import { SignalLike, useEffect, useScope, useSubscope } from "./scope.js"; interface Renderer { _component?: Component; _svg?: boolean; _nodes?: IterableIterator; _ifConditions: Readonly[]>; _node(fallback: () => N): N; } type RendererOverrides = Partial>; const createRenderer = (override: RendererOverrides = {}): Renderer => ({ _ifConditions: [], _node(fallback: () => N): N { return (this._nodes?.next().value as N | undefined) ?? fallback(); }, ...override, }); export const useRenderer = () => { const scope = useScope<{ _renderer?: Renderer }>(); return (scope._details._renderer ??= createRenderer()); }; export const runWithRenderer = ( override: RendererOverrides, fn: () => T, ): T => { const currRenderer = useRenderer(); const _renderer = createRenderer({ ...currRenderer, ...override, }); const [result, destroy] = useSubscope(fn, { details: { _renderer }, }); useEffect(() => destroy); return result; };