BallotLines<TCandidate extends Comparable>.parse constructor

BallotLines<TCandidate extends Comparable>.parse(
  1. String input,
  2. Map<String, TCandidate> candidateFromText(
    1. Set<String>
    ), {
  3. String candidateToText(
    1. TCandidate
    ) = _defaultCandidateText,
})

Implementation

factory BallotLines.parse(
  String input,
  Map<String, TCandidate> Function(Set<String>) candidateFromText, {
  String Function(TCandidate) candidateToText = _defaultCandidateText,
}) {
  final map = LinkedHashMap<List<String>, int>(
    equals: const ListEquality<String>().equals,
    hashCode: const ListEquality<String>().hash,
  );

  for (var value in parse(input)) {
    map[value.candidates] = (map[value.candidates] ?? 0) + value.count;
  }

  final candidateStrings = map.keys.expand((c) => c).toSet();

  final candidateCache = candidateFromText(candidateStrings);

  final lines = map.entries
      .map(
        (e) => BallotLine<TCandidate>(
          e.value,
          e.key
              .map((string) => candidateCache[string]!)
              .toList(growable: false),
        ),
      )
      .toList(growable: false)
        ..sort();

  return BallotLines(lines, candidateToText: candidateToText);
}