@extra-array/symmetric-difference
Version:
Gives values not present in both arrays.
59 lines (58 loc) • 1.39 kB
JavaScript
;
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);
}
module.exports = symmetricDifference;