import Participant from './Participant';
import Round from './Round';
+export const calculateScores = tournament => {
+ if (!tournament || !tournament.participants || !tournament.participants.length) return [];
+ const scores = tournament.participants.map(participant => ({ participant, score: 0 }));
+ if (!tournament.rounds || !tournament.rounds.length) return scores;
+ tournament.rounds.forEach(round => {
+ const filtered = Participant
+ .sortByResult(tournament.participants, round)
+ .map(p => ({ participant: p, result: Participant.findResult(p, round) }))
+ .filter(r => r.result && (r.result.time || r.result.forfeit))
+ .reverse();
+ let running = 0;
+ let bonus = 1;
+ let lastResult = null;
+ for (let i = 0; i < filtered.length; ++i) {
+ const score = scores.find(s => s.participant.id === filtered[i].participant.id);
+ if (!score) return;
+ const result = filtered[i].result;
+ const betterThanLast = lastResult === null || result.time < lastResult;
+ if (!result.forfeit && betterThanLast) {
+ running += bonus;
+ lastResult = result.time;
+ bonus = 1;
+ } else {
+ ++bonus;
+ }
+ if (!result.forfeit) {
+ score.score += running;
+ }
+ }
+ });
+ return scores.sort(compareScore).reverse();
+};
+
+export const compareScore = (a, b) => {
+ const a_score = a && a.score ? a.score : 0;
+ const b_score = b && b.score ? b.score : 0;
+ if (a_score < b_score) return -1;
+ if (b_score < a_score) return 1;
+ return 0;
+};
+
export const findParticipant = (tournament, user) => {
if (!tournament || !tournament.participants || !tournament.participants.length) return null;
if (!user || !user.id) return null;
};
};
+export const patchRound = (tournament, round) => {
+ if (!tournament) return tournament;
+ return {
+ ...tournament,
+ rounds: tournament.rounds.map(r => r.id === round.id ? { ...r, ...round } : r),
+ };
+};
+
export const sortParticipants = tournament => {
if (!tournament || !tournament.participants || !tournament.participants.length) {
return tournament;
};
export default {
+ calculateScores,
+ compareScore,
findParticipant,
patchResult,
sortParticipants,