refactor: extract dedupeByID utility

This commit is contained in:
2026-06-13 16:25:21 +02:00
parent a09ff85ff8
commit 26a8878fc2

View File

@@ -1,25 +1,34 @@
import { onHtmxLoad, onReady } from "./utils"; import { onHtmxLoad, onReady } from "./utils";
const dedupeWithin = (root: ParentNode): void => { export const dedupeByID = <T>(items: T[], idForItem: (item: T) => string | undefined): T[] => {
const seen = new Set<string>(); const seen = new Set<string>();
const elements = root.querySelectorAll<HTMLElement>(":scope > [data-id]"); return items.filter((item) => {
const id = idForItem(item);
elements.forEach((item) => {
const id = item.dataset.id;
if (!id) { if (!id) {
return; return true;
} }
if (seen.has(id)) { if (seen.has(id)) {
item.remove(); return false;
return;
} }
seen.add(id); seen.add(id);
return true;
}); });
}; };
const dedupe = (root: ParentNode = document): void => { export const dedupeWithin = (root: ParentNode): void => {
const elements = root.querySelectorAll<HTMLElement>(":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<ParentNode>(); const containers = new Set<ParentNode>();
const elements = root.querySelectorAll<HTMLElement>("[data-id]"); const elements = root.querySelectorAll<HTMLElement>("[data-id]");