contestantSummarys = {
const map = d3.rollup(pastEvents,
events => ({
contestant: events[0].contestant,
name: events[0].name,
elapsedTotal: d3.pairs(d3.extent(events.map(e => e.timestamp)), (a, b) => b - a)[0],
latestCheckpoint: d3.max(events.map(e => e.checkpoint)),
events,
timestamps: events.map(e => e.timestamp),
deltas: d3.pairs(events, (a, b) => b.timestamp - a.timestamp),
}),
e => e.contestant);
const contestantSummarys = Array.from(map).map(([_, d]) => ({
...d,
checkpointSegments: d3.pairs(d3.cumsum([0, ...d.deltas]))
}));
contestantSummarys.sort((a, b) => {
const i = Math.min(a.latestCheckpoint, b.latestCheckpoint);
return (a.timestamps[i] - a.timestamps[0]) - (b.timestamps[i] - b.timestamps[0]);
});
contestantSummarys.forEach((d, i) => d.rank = i + 1);
return contestantSummarys;
}