@monstermann/fn
Version:
A utility library for TypeScript.
41 lines (39 loc) • 1.26 kB
JavaScript
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 };