mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-07-15 07:43:44 -05:00
32 lines
1.1 KiB
TypeScript
32 lines
1.1 KiB
TypeScript
import * as R from "remeda";
|
|
import type { TournamentManagerDataSet } from "~/modules/brackets-manager/types";
|
|
|
|
/**
|
|
* Maps each round_id to the cumulative number of teams eliminated by the end of
|
|
* that round, counting one elimination per non-bye match. This is a structural
|
|
* property of the bracket that does not depend on which matches have already
|
|
* been reported, so teams tied at the same placement resolve to the same
|
|
* placement even while some of their round's matches are still in progress.
|
|
*/
|
|
export function cumulativeEliminationsByRound(
|
|
matches: TournamentManagerDataSet["match"],
|
|
): Map<number, number> {
|
|
const result = new Map<number, number>();
|
|
|
|
const roundIds = R.unique(matches.map((match) => match.round_id)).sort(
|
|
(a, b) => a - b,
|
|
);
|
|
|
|
let cumulativeEliminations = 0;
|
|
for (const roundId of roundIds) {
|
|
const eliminationsThisRound = matches.filter(
|
|
(match) =>
|
|
match.round_id === roundId && match.opponent1 && match.opponent2,
|
|
).length;
|
|
cumulativeEliminations += eliminationsThisRound;
|
|
result.set(roundId, cumulativeEliminations);
|
|
}
|
|
|
|
return result;
|
|
}
|