eulejs
Version:
Euler's diagrams are non-empty Venn's diagrams.
57 lines (56 loc) • 2.61 kB
JavaScript
(() => {
"use strict";
var e = {
d: (t, r) => {
for (var o in r) e.o(r, o) && !e.o(t, o) && Object.defineProperty(t, o, {
enumerable: !0,
get: r[o]
})
},
o: (e, t) => Object.prototype.hasOwnProperty.call(e, t),
r: e => {
"undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {
value: "Module"
}), Object.defineProperty(e, "__esModule", {
value: !0
})
}
},
t = {};
e.r(t), e.d(t, {
euler: () => i,
eulerGen: () => c
});
const r = require("lodash"),
o = (e, t, o) => Object.entries(r.cloneDeep(e)).reduce(((e, [r, o]) => t(e, r, o)), o),
n = e => [...new Set(e)];
function* l(e) {
if (e.constructor !== {}.constructor && e.constructor !== [].constructor) throw new TypeError("Ill-conditioned input. It must be either a json-like or array of arrays object!");
let t = !0;
for (const r of Object.values(e)) t &= n(r).length === r.length;
if (t || (console.warn("Each array MUST NOT have duplicates"), e = o(e, ((t, r, o) => (t[o] = n(e[o]), t)), {})), 0 === Object.values(e).length) throw new TypeError("There must at least ONE set!");
1 === Object.values(e).length && (yield Object.entries(e)[0]);
const c = e => Object.keys(e).filter((t => 0 !== e[t].length));
let i = [],
f = "",
s = [],
a = "",
d = [],
u = [],
h = {},
y = c(e);
for (const t of y)
if (i = r.difference(y, [t]).filter((t => 0 !== e[t].length)).map((e => String(e))), 0 !== i.length && 0 !== e[t].length) {
h = o(i, ((t, r, o) => (t[o] = e[o], t)), {});
for (const o of l(h)) f = o[0], s = o[1], u = r.difference(s, e[t]), 0 !== u.length && (yield [f, u], f.split(",").forEach((t => {
e[t] = r.difference(e[t], u)
})), e[t] = r.difference(e[t], u)), d = r.intersection(s, e[t]), 0 !== d.length && (a = [t].concat(f.split(",")).join(","), yield [a, d], f.split(",").forEach((t => {
e[t] = r.difference(e[t], d)
})), e[t] = r.difference(e[t], d)), y = c(e);
0 !== e[t].length && (yield [String(t), e[t]], e[t] = [])
}
}
let c = l,
i = e => Object.fromEntries([...l(e)]);
module.exports = t
})();