Skip to content

Commit

Permalink
Remove use of ReadOnlyCollection
Browse files Browse the repository at this point in the history
Use List.unmodifiable instead
...although a crashing bug means this will only work in 1.12 builds
  • Loading branch information
kevmoo committed Aug 6, 2015
1 parent 8857d9e commit ea5ff85
Show file tree
Hide file tree
Showing 23 changed files with 64 additions and 91 deletions.
3 changes: 1 addition & 2 deletions lib/calc.dart
Expand Up @@ -6,7 +6,6 @@ import 'package:bot/bot.dart' hide ReadOnlyCollection;

import 'map.dart';
import 'vote.dart';
import 'src/util.dart';

class CalcEngine {
final ThrottledStream<LocationData, DistanceElection> _distanceElectionMapper =
Expand Down Expand Up @@ -57,7 +56,7 @@ class CalcEngine {
assert(value != null);
assert(locationData != null);

final roCandidates = new ReadOnlyCollection<MapPlayer>(value);
final roCandidates = new List<MapPlayer>.unmodifiable(value);

if (roCandidates.length > 0) {
final newData =
Expand Down
1 change: 0 additions & 1 deletion lib/html.dart
Expand Up @@ -7,7 +7,6 @@ import 'package:bot/bot.dart' hide ReadOnlyCollection;
import 'package:bot_web/bot_html.dart';
import 'map.dart';
import 'vote.dart';
import 'src/util.dart';

part 'src/html/candidate_manager_view.dart';
part 'src/html/plurality_view.dart';
Expand Down
1 change: 0 additions & 1 deletion lib/map.dart
Expand Up @@ -5,7 +5,6 @@ import 'dart:math';
import 'package:bot/bot.dart' hide ReadOnlyCollection;

import 'vote.dart';
import 'src/util.dart';

part 'src/map/distance_election.dart';
part 'src/map/distance_election_place.dart';
Expand Down
2 changes: 0 additions & 2 deletions lib/retained.dart
Expand Up @@ -9,8 +9,6 @@ import 'package:bot_web/bot_html.dart';
import 'package:bot_web/bot_retained.dart';
import 'package:vote/map.dart';

import 'src/util.dart';

part 'src/retained/candidate_element.dart';
part 'src/retained/candidate_map_element.dart';
part 'src/retained/map_element_base.dart';
Expand Down
6 changes: 3 additions & 3 deletions lib/src/html/candidate_manager_view.dart
Expand Up @@ -4,15 +4,15 @@ class CandidateManagerView extends HtmlView {
static const String _CANDIDATE_ID_ATTRIBUTE = 'candidate-id';
final StreamController<MapPlayer> _requestRemoveCandidateHandle;
final StreamController _requestNewCandidateHandle;
ReadOnlyCollection<MapPlayer> _candidates;
List<MapPlayer> _candidates;

CandidateManagerView(DivElement node)
: _requestRemoveCandidateHandle = new StreamController<MapPlayer>(),
_requestNewCandidateHandle = new StreamController(),
_candidates = new ReadOnlyCollection<MapPlayer>.empty(),
_candidates = new List<MapPlayer>.unmodifiable([]),
super(node);

void set candidates(ReadOnlyCollection<MapPlayer> value) {
void set candidates(List<MapPlayer> value) {
assert(value != null);
_candidates = value;
markDirty();
Expand Down
4 changes: 2 additions & 2 deletions lib/src/html/condorcet_view.dart
Expand Up @@ -5,7 +5,7 @@ class CondorcetView extends HtmlView {

final StreamController _hoverChangedHandle = new StreamController();
CondorcetElection _election;
ReadOnlyCollection<Player> _candidates;
List<Player> _candidates;
List<Player> _highlightCandidates;

CondorcetView(DivElement node) : super(node);
Expand Down Expand Up @@ -42,7 +42,7 @@ class CondorcetView extends HtmlView {
var evenCandidateRow = true;

// add columns for opponents
_candidates = new ReadOnlyCollection(_election.places.expand((p) => p));
_candidates = new List.unmodifiable(_election.places.expand((p) => p));

for (final opp in _candidates) {
cell = new Element.tag('th');
Expand Down
4 changes: 2 additions & 2 deletions lib/src/html/irv_view.dart
Expand Up @@ -36,13 +36,13 @@ class IrvView extends HtmlView {
}

final candidates =
new ReadOnlyCollection(_election.rounds.first.places.expand((p) => p));
new List.unmodifiable(_election.rounds.first.places.expand((p) => p));

var table = new TableElement();

TableRowElement row;
TableCellElement cell;
ReadOnlyCollection<PluralityElectionPlace> previousPlaces;
List<PluralityElectionPlace> previousPlaces;

for (var i = 0; i < election.rounds.length; i++) {
final round = election.rounds[i];
Expand Down
4 changes: 2 additions & 2 deletions lib/src/map/distance_ballot.dart
Expand Up @@ -5,7 +5,7 @@ class DistanceBallot<TVoter extends MapPlayer, TCandidate extends MapPlayer>
final Map<TCandidate, num> _distances;

DistanceBallot._internal(
TVoter voter, ReadOnlyCollection<TCandidate> items, this._distances)
TVoter voter, List<TCandidate> items, this._distances)
: super.protected(voter, items);

factory DistanceBallot(TVoter voter, Iterable<TCandidate> candidates) {
Expand All @@ -26,7 +26,7 @@ class DistanceBallot<TVoter extends MapPlayer, TCandidate extends MapPlayer>
return d;
});

var items = new ReadOnlyCollection(rank);
var items = new List.unmodifiable(rank);

return new DistanceBallot._internal(voter, items, distances);
}
Expand Down
12 changes: 6 additions & 6 deletions lib/src/map/distance_election.dart
Expand Up @@ -2,9 +2,9 @@ part of vote.map;

class DistanceElection<TVoter extends MapPlayer, TCandidate extends MapPlayer>
extends Election<TVoter, TCandidate> {
final ReadOnlyCollection<TCandidate> candidates;
final ReadOnlyCollection<DistanceBallot<TVoter, TCandidate>> ballots;
final ReadOnlyCollection<DistanceElectionPlace<TCandidate>> places;
final List<TCandidate> candidates;
final List<DistanceBallot<TVoter, TCandidate>> ballots;
final List<DistanceElectionPlace<TCandidate>> places;

DistanceElection._internal(this.candidates, this.ballots, this.places);

Expand All @@ -14,9 +14,9 @@ class DistanceElection<TVoter extends MapPlayer, TCandidate extends MapPlayer>

factory DistanceElection(
Iterable<TVoter> voters, Iterable<TCandidate> candidates) {
final cans = new ReadOnlyCollection<TCandidate>(candidates);
final cans = new List<TCandidate>.unmodifiable(candidates);

final ballots = new ReadOnlyCollection(voters
final ballots = new List.unmodifiable(voters
.map((voter) => new DistanceBallot<MapPlayer, MapPlayer>(voter, cans)));

//
Expand All @@ -41,7 +41,7 @@ class DistanceElection<TVoter extends MapPlayer, TCandidate extends MapPlayer>
distances.sort((a, b) => a.item1.compareTo(b.item1));

int placeNumber = 1;
final places = new ReadOnlyCollection(distances.map((d) {
final places = new List.unmodifiable(distances.map((d) {
var placeCans = distanceGroups[d];
final place =
new DistanceElectionPlace(placeNumber, placeCans, d.item1, d.item2);
Expand Down
12 changes: 6 additions & 6 deletions lib/src/map/location_data.dart
Expand Up @@ -8,8 +8,8 @@ class LocationData {

static List<num> _candidateHues;

final ReadOnlyCollection<MapPlayer> candidates;
final ReadOnlyCollection<MapPlayer> voters;
final List<MapPlayer> candidates;
final List<MapPlayer> voters;

LocationData(this.voters, this.candidates) {
assert(this.candidates.length > 0);
Expand Down Expand Up @@ -48,14 +48,14 @@ class LocationData {
candidates.add(candidate);
});

return new LocationData(new ReadOnlyCollection<MapPlayer>.wrap(voters),
new ReadOnlyCollection<MapPlayer>.wrap(candidates));
return new LocationData(new List<MapPlayer>.unmodifiable(voters),
new List<MapPlayer>.unmodifiable(candidates));
}

LocationData cloneAndRemove(MapPlayer mp) {
requireArgumentNotNull(mp, 'mp');

var newCans = new ReadOnlyCollection(candidates.where((e) => e != mp));
var newCans = new List.unmodifiable(candidates.where((e) => e != mp));

return new LocationData(voters, newCans);
}
Expand Down Expand Up @@ -85,7 +85,7 @@ class LocationData {

newCans.insert(i, mp);

return new LocationData(voters, new ReadOnlyCollection(newCans));
return new LocationData(voters, new List.unmodifiable(newCans));
}

static num getHue(MapPlayer candidate) {
Expand Down
4 changes: 2 additions & 2 deletions lib/src/retained/candidate_map_element.dart
Expand Up @@ -6,7 +6,7 @@ class CandidateMapElement extends ParentThing implements MapElementBase {

num _radius = 0;
List<CandidateElement> _elements;
ReadOnlyCollection<MapPlayer> _showOnlyPlayers = null;
List<MapPlayer> _showOnlyPlayers = null;

CandidateMapElement(int w, int h) : super(w, h);

Expand Down Expand Up @@ -42,7 +42,7 @@ class CandidateMapElement extends ParentThing implements MapElementBase {
if (value == null) {
_showOnlyPlayers = null;
} else {
var newVal = new ReadOnlyCollection(value);
var newVal = new List.unmodifiable(value);
assert($(newVal).distinct().length == newVal.length);
assert(newVal.every((e) => _players.indexOf(e) >= 0));
_showOnlyPlayers = newVal;
Expand Down
12 changes: 0 additions & 12 deletions lib/src/util.dart

This file was deleted.

10 changes: 4 additions & 6 deletions lib/src/vote/condorcet_candidate_profile.dart
@@ -1,16 +1,14 @@
library vote.vote.condorcet_candidate_profile;

import '../util.dart';
import 'player.dart';

class CondorcetCandidateProfile<TCandidate extends Player> {
final TCandidate candidate;
final ReadOnlyCollection<TCandidate> lostTo;
final ReadOnlyCollection<TCandidate> beat;
final ReadOnlyCollection<TCandidate> tied;
final List<TCandidate> lostTo;
final List<TCandidate> beat;
final List<TCandidate> tied;

CondorcetCandidateProfile(
this.candidate, this.lostTo, this.beat, this.tied);
CondorcetCandidateProfile(this.candidate, this.lostTo, this.beat, this.tied);

int get hashCode => this.candidate.hashCode;

Expand Down
15 changes: 7 additions & 8 deletions lib/src/vote/condorcet_election.dart
Expand Up @@ -2,7 +2,6 @@ library vote.vote.condorcet_election;

import 'package:bot/bot.dart' hide ReadOnlyCollection;

import '../util.dart';
import 'player.dart';
import 'condorcet_pair.dart';
import 'election.dart';
Expand All @@ -14,18 +13,18 @@ class CondorcetElection<TVoter extends Player, TCandidate extends Player>
extends Election<TVoter, TCandidate> {
final Set<CondorcetPair<TVoter, TCandidate>> _pairs;
final Map<TCandidate, CondorcetCandidateProfile<TCandidate>> _profiles;
final ReadOnlyCollection<RankedBallot<TVoter, TCandidate>> ballots;
final ReadOnlyCollection<ElectionPlace<TCandidate>> places;
final List<RankedBallot<TVoter, TCandidate>> ballots;
final List<ElectionPlace<TCandidate>> places;

CondorcetElection._internal(
this._pairs, this._profiles, this.ballots, this.places);

factory CondorcetElection(
Iterable<RankedBallot<TVoter, TCandidate>> ballots) {
final roBallots = new ReadOnlyCollection(ballots);
final roBallots = new List.unmodifiable(ballots);

// Check voter uniqueness
final voterList = new ReadOnlyCollection(roBallots.map((b) => b.voter));
final voterList = new List.unmodifiable(roBallots.map((b) => b.voter));
requireArgument(CollectionUtil.allUnique(voterList),
"Only one ballot per voter is allowed");

Expand Down Expand Up @@ -83,8 +82,8 @@ class CondorcetElection<TVoter extends Player, TCandidate extends Player>
}

var profile = new CondorcetCandidateProfile(candidate,
new ReadOnlyCollection(lostTo), new ReadOnlyCollection(beat),
new ReadOnlyCollection(tied));
new List.unmodifiable(lostTo), new List.unmodifiable(beat),
new List.unmodifiable(tied));
candidateProfiles[candidate] = profile;

tarjanMap[candidate] = tarjanLostTiedSet;
Expand All @@ -101,7 +100,7 @@ class CondorcetElection<TVoter extends Player, TCandidate extends Player>
}

return new CondorcetElection._internal(set, candidateProfiles, roBallots,
new ReadOnlyCollection<ElectionPlace<TCandidate>>(places));
new List<ElectionPlace<TCandidate>>.unmodifiable(places));
}

Iterable<TCandidate> get candidates => _profiles.keys;
Expand Down
5 changes: 2 additions & 3 deletions lib/src/vote/condorcet_pair.dart
Expand Up @@ -3,12 +3,11 @@ library vote.vote.condorcet_pair;
import 'package:bot/bot.dart' hide ReadOnlyCollection;

import 'player.dart';
import '../util.dart';
import 'ranked_ballot.dart';

class CondorcetPair<TVoter extends Player, TCandidate extends Player>
extends Tuple<TCandidate, TCandidate> {
final ReadOnlyCollection<RankedBallot<TVoter, TCandidate>> ballots;
final List<RankedBallot<TVoter, TCandidate>> ballots;
final int firstOverSecond;
final int secondOverFirst;

Expand All @@ -32,7 +31,7 @@ class CondorcetPair<TVoter extends Player, TCandidate extends Player>
return new CondorcetPair._internal(can1, can2, null, 0, 0);
} else {
var roBallots =
new ReadOnlyCollection<RankedBallot<TVoter, TCandidate>>(bals);
new List<RankedBallot<TVoter, TCandidate>>.unmodifiable(bals);

requireArgument(CollectionUtil.allUnique(roBallots),
"Only one ballot per voter is allowed");
Expand Down
3 changes: 1 addition & 2 deletions lib/src/vote/election.dart
Expand Up @@ -3,13 +3,12 @@ library vote.vote.election;
import 'player.dart';
import 'ballot.dart';

import '../util.dart';
import 'election_place.dart';

abstract class Election<TVoter extends Player, TCandidate extends Player> {
Iterable<TCandidate> get candidates;
Iterable<Ballot<TVoter, TCandidate>> get ballots;
ReadOnlyCollection<ElectionPlace<TCandidate>> get places;
List<ElectionPlace<TCandidate>> get places;

TCandidate get singleWinner {
if (places.length > 0 && places[0].length == 1) {
Expand Down
4 changes: 2 additions & 2 deletions lib/src/vote/election_place.dart
@@ -1,10 +1,10 @@
library vote.vote.election_place;

import '../util.dart';
import 'dart:collection';
import 'player.dart';

class ElectionPlace<TCandidate extends Player>
extends ReadOnlyCollection<TCandidate> {
extends UnmodifiableListView<TCandidate> {
final int place;

ElectionPlace(this.place, Iterable<TCandidate> candidates)
Expand Down
13 changes: 6 additions & 7 deletions lib/src/vote/irv_election.dart
Expand Up @@ -2,7 +2,6 @@ library vote.vote.irv_election;

import 'package:bot/bot.dart' hide ReadOnlyCollection;

import '../util.dart';
import 'player.dart';
import 'ballot.dart';
import 'irv_round.dart';
Expand All @@ -11,17 +10,17 @@ import 'ranked_ballot.dart';

class IrvElection<TVoter extends Player, TCandidate extends Player>
extends Election<TVoter, TCandidate> {
final ReadOnlyCollection<TCandidate> candidates;
final ReadOnlyCollection<Ballot<TVoter, TCandidate>> ballots;
final ReadOnlyCollection<IrvRound<TVoter, TCandidate>> rounds;
final List<TCandidate> candidates;
final List<Ballot<TVoter, TCandidate>> ballots;
final List<IrvRound<TVoter, TCandidate>> rounds;

IrvElection._internal(this.candidates, this.ballots, this.rounds);

factory IrvElection(Iterable<RankedBallot<TVoter, TCandidate>> ballots) {
final roBallots = new ReadOnlyCollection(ballots);
final roBallots = new List.unmodifiable(ballots);

final roCandidates =
new ReadOnlyCollection($(roBallots).expand((b) => b.rank).distinct());
new List.unmodifiable($(roBallots).expand((b) => b.rank).distinct());

final rounds = new List<IrvRound<TVoter, TCandidate>>();

Expand All @@ -35,7 +34,7 @@ class IrvElection<TVoter extends Player, TCandidate extends Player>
} while (!round.isFinal);

return new IrvElection._internal(
roCandidates, roBallots, new ReadOnlyCollection.wrap(rounds));
roCandidates, roBallots, new List.unmodifiable(rounds));
}

// TODO: need to add `places`
Expand Down
3 changes: 1 addition & 2 deletions lib/src/vote/irv_elimination.dart
@@ -1,13 +1,12 @@
library vote.vote.irv_elimination;

import '../util.dart';
import 'player.dart';
import 'ranked_ballot.dart';

class IrvElimination<TVoter extends Player, TCandidate extends Player> {
final TCandidate candidate;
final Map<TCandidate, List<RankedBallot<TVoter, TCandidate>>> _transfers;
final ReadOnlyCollection<RankedBallot<TVoter, TCandidate>> exhausted;
final List<RankedBallot<TVoter, TCandidate>> exhausted;

IrvElimination(this.candidate, this._transfers, this.exhausted) {
assert(candidate != null);
Expand Down

0 comments on commit ea5ff85

Please sign in to comment.