public bool Join(List <Origin> voters, Origin voterToJoin) { bool joined = false; UndoBuffer.Push(new UndoAction(UndoActionType.Join, VoteStorage)); foreach (var voter in voters) { joined = JoinImpl(voter, voterToJoin) || joined; } if (joined) { OnPropertyChanged("Votes"); OnPropertyChanged("Voters"); OnPropertyChanged(nameof(HasUndoActions)); } else { UndoBuffer.Pop(); } return(joined); /// <summary> /// Implement joining logic per voter. /// </summary> /// <param name="joiningVoter">The voter being moved to a new voting support set.</param> /// <param name="voterToJoin">The voter being joined.</param> /// <returns>Returns true if the join was completed.</returns> bool JoinImpl(Origin joiningVoter, Origin voterToJoin) { var source = GetVotesBy(joiningVoter); var dest = GetVotesBy(voterToJoin); if (!source.Any() || !dest.Any()) { return(false); } bool joined = false; // Remove support from any votes where the target voter isn't also present. foreach (var vote in source) { if (!VoteStorage.DoesVoterSupportVote(voterToJoin, vote)) { VoteStorage.RemoveSupporterFromVote(vote, joiningVoter); } } VoteStorage.RemoveUnsupportedVotes(); foreach (var vote in dest) { if (!VoteStorage.DoesVoterSupportVote(joiningVoter, vote)) { VoteStorage.AddSupporterToVote(vote, joiningVoter); joined = true; } } return(joined); } }