melt
Version:
The next generation of Melt UI. Built for Svelte 5.
55 lines (54 loc) • 1.88 kB
JavaScript
export function unique(value, seen = new WeakMap()) {
// Handle primitives
if (value === null)
return "null";
if (typeof value !== "object") {
if (typeof value === "bigint")
return `bigint:${value}`;
if (typeof value === "symbol")
return `symbol:${value.toString()}`;
if (typeof value === "function")
return `function:${value.toString()}`;
if (Number.isNaN(value))
return "NaN";
return `${typeof value}:${value}`;
}
// Handle circular references
if (seen.has(value))
return "[Circular]";
seen.set(value, true);
try {
// Handle arrays
if (Array.isArray(value)) {
const items = value.map((item) => unique(item, seen));
return `array:[${items.join(",")}]`;
}
// Handle specific object types
if (value instanceof Date) {
return `date:${value.toISOString()}`;
}
if (value instanceof RegExp) {
return `regexp:${value.toString()}`;
}
if (value instanceof Map) {
const entries = Array.from(value.entries())
.sort(([a], [b]) => unique(a).localeCompare(unique(b)))
.map(([k, v]) => `${unique(k, seen)}:${unique(v, seen)}`);
return `map:{${entries.join(",")}}`;
}
if (value instanceof Set) {
const items = Array.from(value)
.map((item) => unique(item, seen))
.sort();
return `set:{${items.join(",")}}`;
}
// Handle plain objects
const entries = Object.entries(value)
.sort(([a], [b]) => a.localeCompare(b))
.map(([k, v]) => `${k}:${unique(v, seen)}`);
return `object:{${entries.join(",")}}`;
}
finally {
seen.delete(value);
}
}