UNPKG

@extra-array/symmetric-difference

Version:

Gives values not present in both arrays.

58 lines (57 loc) 1.38 kB
function from$(x) { return Array.isArray(x) ? x : [...x]; } function concat$(x, ...ys) { for (var y of ys) x.push(...y); return x; } function id(v) { return v; } function cmp(a, b) { return a < b ? -1 : (a > b ? 1 : 0); } function from$$1(x) { return Array.isArray(x) ? x : [...x]; } function from(vs, fm = null) { return new Set(fm ? from$$1(vs).map(fm) : vs); } function differenceMap(x, y, fm = null) { var s = from(y, fm); var fm = fm || id; var a = [], i = -1; for (var u of x) { var u1 = fm(u, ++i, x); if (!s.has(u1)) a.push(u); } return a; } function differenceDual(x, y, fc = null, fm = null) { var fc = fc || cmp, fm = fm || id; var y1 = [...y].map(fm); var a = [], i = -1; x: for (var u of x) { var u1 = fm(u, ++i, x); for (var v1 of y1) if (fc(u1, v1) === 0) continue x; a.push(u); } return a; } function difference(x, y, fc = null, fm = null) { if (fc) return differenceDual(x, y, fc, fm); else return differenceMap(x, y, fm); } function symmetricDifference(x, y, fc = null, fm = null) { var x0 = from$(x), y0 = from$(y); var ax = difference(x0, y0, fc, fm); var ay = difference(y0, x0, fc, fm); return concat$(ax, ay); } export { symmetricDifference as default };