function rollupStack() {
let value = (D) => D.length;
let group = (d, i) => i;
let key = (d, i) => i;
const stack = d3.stack().value(
([, group], key) => group.get(key)
)
function main(data) {
stack.keys([...d3.union(data.map( d => key(d)))]);
const rolled = d3.rollup(data, value, group, key);
const stackKeys = stack.keys()();
const rollKeys = [...rolled.keys()];
return stack(rolled).flatMap((group, i) => {
return group.map(([start, end, ...rest] , j) => {
return [start, end, rollKeys[j], stackKeys[i], ...rest];
})
})
}
main.order = (x) => {
if (x === undefined) return stack.order();
stack.order(x)
return main;
}
main.offset = (x) => {
if (x === undefined) return stack.offset();
stack.offset(x);
return main;
}
main.value = (x) => {
if (x === undefined) return value;
value = x;
return main;
}
main.group = (x) => {
if (x === undefined) return group;
group = x;
return main;
}
main.key = (x) => {
if (x === undefined) return key;
key = x;
return main;
}
return main
}