diff --git a/static/dedupe.ts b/static/dedupe.ts index 0f76112..51bc809 100644 --- a/static/dedupe.ts +++ b/static/dedupe.ts @@ -1,25 +1,34 @@ import { onHtmxLoad, onReady } from "./utils"; -const dedupeWithin = (root: ParentNode): void => { +export const dedupeByID = (items: T[], idForItem: (item: T) => string | undefined): T[] => { const seen = new Set(); - const elements = root.querySelectorAll(":scope > [data-id]"); - - elements.forEach((item) => { - const id = item.dataset.id; + return items.filter((item) => { + const id = idForItem(item); if (!id) { - return; + return true; } if (seen.has(id)) { - item.remove(); - return; + return false; } seen.add(id); + return true; }); }; -const dedupe = (root: ParentNode = document): void => { +export const dedupeWithin = (root: ParentNode): void => { + const elements = root.querySelectorAll(":scope > [data-id]"); + const uniqueElements = new Set(dedupeByID(Array.from(elements), (item) => item.dataset.id)); + + elements.forEach((item) => { + if (!uniqueElements.has(item)) { + item.remove(); + } + }); +}; + +export const dedupe = (root: ParentNode = document): void => { const containers = new Set(); const elements = root.querySelectorAll("[data-id]");