resolve method

  1. @override
PollResult resolve(
  1. PollTally tally
)
override

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);
}