UNPKG

@monstermann/fn

Version:

A utility library for TypeScript.

41 lines (39 loc) 1.26 kB
import { dfdlT } from "@monstermann/dfdl"; //#region src/set/symmetricDifference.ts /** * `symmetricDifference(target, source)` * * Returns a new set containing values that exist in either the `target` set or the `source` set, but not in both (exclusive or). * * ```ts * symmetricDifference(new Set([1, 2, 3]), new Set([3, 4, 5])); // Set([1, 2, 4, 5]) * symmetricDifference(new Set([1, 2]), new Set([3, 4])); // Set([1, 2, 3, 4]) * ``` * * ```ts * pipe(new Set([1, 2, 3]), symmetricDifference(new Set([3, 4, 5]))); // Set([1, 2, 4, 5]) * pipe(new Set([1, 2]), symmetricDifference(new Set([3, 4]))); // Set([1, 2, 3, 4]) * ``` */ const symmetricDifference = dfdlT((target, source) => { if (source.size === 0) return target; if (target.size === 0) return source; let hasChanges = false; for (const a of target) if (!source.has(a)) { hasChanges = true; break; } if (!hasChanges) { for (const b of source) if (!target.has(b)) { hasChanges = true; break; } } if (!hasChanges) return /* @__PURE__ */ new Set(); const result = /* @__PURE__ */ new Set(); for (const a of target) if (!source.has(a)) result.add(a); for (const b of source) if (!target.has(b)) result.add(b); return result; }, 2); //#endregion export { symmetricDifference };