resolve method
Implementation
@override
PollResult resolve(PollTally tally) {
final amountOfProposals = tally.proposals.length;
final proposalsResults = <ProposalResult>[];
final sortedProposalsResults = <ProposalResult>[];
if (0 == amountOfProposals) {
return PollResult(proposalsResults, sortedProposalsResults);
}
final amountOfJudges = tally.proposals[0].countJudgments();
for (final proposal in tally.proposals) {
if (proposal.countJudgments() != amountOfJudges) {
throw Exception('''
Some proposals hold more judgments than others.
Balance your tally first, perhaps using a PollTally#balanceWith…() method?''');
}
}
var index = 0;
for (final proposal in tally.proposals) {
final analysis = Analysis();
const rank = 1; // We'll set the actual rank later, after the score sort
final score = computeScore(proposal);
analysis.run(proposal, favorContestation);
final result = ProposalResult(index, rank, score, analysis);
proposalsResults.add(result);
sortedProposalsResults.add(result);
index++;
}
sortedProposalsResults.sort((a, b) => b.score.compareTo(a.score));
var rank = 1;
for (var curr = 0; curr < amountOfProposals; curr++) {
if ((curr > 0) &&
(sortedProposalsResults[curr - 1].score !=
sortedProposalsResults[curr].score)) {
rank = curr + 1;
}
sortedProposalsResults[curr].rank = rank;
}
return PollResult(proposalsResults, sortedProposalsResults);
}