function stack() {
const slice = Array.prototype.slice;
let series = d => d.key,
seriesData = d => d.value,
category = d => d.key,
value = d => d.value,
order = d3.stackOrderNone,
offset = d3.stackOffsetNone;
function stack(data) {
const m = data.length,
categories = nestedCategories(data, category, seriesData),
tuple = d => [category(d), d],
n = categories.length,
sz = new Array(m);
let i, j, oz;
for (i = 0; i < m; ++i) {
const si = sz[i] = new Array(n),
diMap = new Map(seriesData(data[i]).map(tuple));
for (j = 0; j < n; ++j) {
const dij = diMap.get(categories[j]);
si[j] = [0, +value(dij, j, data[i])];
si[j].category = categories[j];
si[j].data = dij;
}
si.series = series(data[i], i, data);
}
for (i = 0, oz = order(sz); i < m; ++i) {
sz[oz[i]].index = i;
}
offset(sz, oz);
return sz;
}
stack.series = function (_) {
return _ === undefined ? series : (series = _, this);
}
stack.seriesData = function (_) {
return _ === undefined ? seriesData : (seriesData = _, this);
}
stack.category = function (_) {
return _ === undefined ? category : (category = _, this);
};
stack.order = function (_) {
return _ === undefined
? order
: (order = _ == null ? d3.stackOrderNone : typeof _ === 'function' ? _ : constant(slice.call(_)), this);
};
stack.offset = function (_) {
return _ === undefined
? offset
: (offset = _ == null ? d3.stackOffsetNone : _, this);
};
stack.value = function (_) {
return _ === undefined ? value : (value = typeof _ === 'function' ? _ : constant(+_), this);
};
return stack;
}