From 1c91c597f7660604479b8e5ddc8345116b26b7ad Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 16 Sep 2025 23:13:47 -0400 Subject: [PATCH] simplify algorithm --- .../svelte/src/internal/server/payload.js | 36 +++++++++---------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/packages/svelte/src/internal/server/payload.js b/packages/svelte/src/internal/server/payload.js index 6f1485b3b3..69eae7e1b7 100644 --- a/packages/svelte/src/internal/server/payload.js +++ b/packages/svelte/src/internal/server/payload.js @@ -408,27 +408,23 @@ export class TreeHeadState { * @param {number[]} path */ set_title(value, path) { - // perform a depth-first (lexicographic) comparison using the path. Reject sets - // from earlier than or equal to the current value. - const current_path = this.#title.path; - - const max_len = Math.max(path.length, current_path.length); - for (let i = 0; i < max_len; i++) { - const contender_segment = path[i]; - const current_segment = current_path[i]; - - // contender shorter than current and all previous segments equal -> earlier - if (contender_segment === undefined) return; - // current shorter than contender and all previous segments equal -> contender is later - if (current_segment === undefined || contender_segment > current_segment) { - this.#title.path = path; - this.#title.value = value; - return; - } - if (contender_segment < current_segment) return; - // else equal -> continue + const current = this.#title.path; + + let i = 0; + let l = Math.min(path.length, current.length); + + // skip identical prefixes - [1, 2, 3, ...] === [1, 2, 3, ...] + while (i < l && path[i] === current[i]) i += 1; + + if (path[i] === undefined) return; + + // replace title if + // - incoming path is longer - [7, 8, 9] > [7, 8] + // - incoming path is later - [7, 8, 9] > [7, 8, 8] + if (current[i] === undefined || path[i] > current[i]) { + this.#title.path = path; + this.#title.value = value; } - // paths are equal -> keep current value (do nothing) } /**