/** * Returns a function that reports whether a given rank is shared by more than * one team. Pass an array of all the rank values in the standings. * * @example * const isTied = buildTiedRankChecker(standings.map(s => s.currentRank)); * isTied(3); // true if two or more teams share rank 3 */ export function buildTiedRankChecker(ranks: number[]): (rank: number) => boolean { const counts = new Map(); for (const rank of ranks) counts.set(rank, (counts.get(rank) ?? 0) + 1); return (rank) => (counts.get(rank) ?? 1) > 1; } /** * Returns the display rank for a team on the league home standings preview. * * Rules: * - If the team has a standing, return its numeric rank, prefixed with "T" if * the rank is shared by more than one team. * - If the team has no standing, it is tied at the position just after all * ranked teams. For example, if 3 teams have standings the unranked teams * show "T4". If no team has standings yet (scores haven't been calculated) * every team is genuinely tied at zero and shows "T1". * * @param standing - The team's standing record, or undefined if none exists. * @param standingsCount - Total number of teams that have a standing record. * @param isTied - Whether this team's rank is shared with another team. */ export function getDisplayRank( standing: { currentRank: number } | undefined, standingsCount: number, isTied?: boolean ): number | string { if (standing) return isTied ? `T${standing.currentRank}` : standing.currentRank; return `T${standingsCount + 1}`; }