diff --git a/packages/runtime-tags/src/dom.ts b/packages/runtime-tags/src/dom.ts index 5eaf5b788..e660fa8e7 100644 --- a/packages/runtime-tags/src/dom.ts +++ b/packages/runtime-tags/src/dom.ts @@ -46,6 +46,7 @@ export { effect, hoist, intersection, + intersectionWithLast, loopClosure, nextTagId, registerDynamicClosure, diff --git a/packages/runtime-tags/src/dom/queue.ts b/packages/runtime-tags/src/dom/queue.ts index 65ecf6318..abc9d26e0 100644 --- a/packages/runtime-tags/src/dom/queue.ts +++ b/packages/runtime-tags/src/dom/queue.ts @@ -22,11 +22,14 @@ export function queueRender( signalKey: number, value?: T, scopeKey = scope.___id, + isLast?: 1 ) { const key = scopeKey * scopeKeyOffset + signalKey; const existingRender = signalKey >= 0 && pendingRendersLookup.get(key); if (existingRender) { existingRender.___value = value; + } else if (isLast) { + signal(scope); } else { const render: PendingRender = { ___key: key, diff --git a/packages/runtime-tags/src/dom/signals.ts b/packages/runtime-tags/src/dom/signals.ts index d6bd93ef1..dc345da88 100644 --- a/packages/runtime-tags/src/dom/signals.ts +++ b/packages/runtime-tags/src/dom/signals.ts @@ -87,6 +87,22 @@ export function intersection( }; } +export function intersectionWithLast( + id: number, + fn: SignalFn, + scopeIdAccessor: Accessor = /*@__KEY__*/ "___id", +): Signal { + return (scope, isLast?: 1) => { + if (scope.___pending) { + if (isLast) { + fn(scope); + } + } else { + queueRender(scope, fn as any, id, 0, scope[scopeIdAccessor], isLast); + } + }; +} + export function loopClosure( valueAccessor: Accessor, ownerLoopNodeAccessor: Accessor, diff --git a/packages/runtime-tags/src/translator/util/runtime.ts b/packages/runtime-tags/src/translator/util/runtime.ts index bc34e088e..126972b88 100644 --- a/packages/runtime-tags/src/translator/util/runtime.ts +++ b/packages/runtime-tags/src/translator/util/runtime.ts @@ -25,6 +25,7 @@ const pureFunctions: Array = [ "createTemplate", "dynamicClosure", "intersection", + "intersectionWithLast", "loopClosure", "loopIn", "loopOf",