feat: memoize half of the participants logic

We need a more elegant way of marking the cache as stale…
master
Dominique Merle 4 years ago
parent 2cc30b1afb
commit 458544c51e

@ -38,6 +38,8 @@ export(Array, Resource) var candidates:Array setget set_candidates, get_candidat
# Array of MajorityJudgmentJudgments
# If you mutate this property directly and not through add_judgment(),
# remember to update the memoization cache as well with update_participants_index()
export(Array, Resource) var judgments:Array setget set_judgments, get_judgments
@ -115,6 +117,9 @@ func set_judgments(__judgments:Array) -> void:
func add_judgment(judgment:MajorityJudgmentJudgment) -> void:
if not judgments:
judgments = Array()
if not judgment.candidate in self.candidates:
printerr("Judgment Candidate is not in the Poll!")
return
for i in range(judgments.size()):
var existing_judgment = judgments[i]
if (
@ -124,6 +129,7 @@ func add_judgment(judgment:MajorityJudgmentJudgment) -> void:
):
judgments[i] = judgment
return
update_participants_index(judgment.participant)
judgments.append(judgment)
@ -159,6 +165,42 @@ func tally() -> MajorityJudgmentPollTally:
return tallier.tally(self)
func get_or_create_participant(identifier:String) -> MajorityJudgmentParticipant:
var known_participants = get_participants_index()
if not known_participants.has(identifier):
known_participants[identifier] = MajorityJudgmentParticipant.make(identifier)
return known_participants[identifier]
# Memoization of expensive computation
var __participants_index := Dictionary() # id => Participant
func get_participants_index():
if __participants_index.empty():
rebuild_participants_index()
return __participants_index
func rebuild_participants_index():
for participant in get_participants():
assert(
not __participants_index.has(participant.name),
"Participants index should be consistent: names should be unique."
)
__participants_index[participant.name] = participant
func update_participants_index(participant:MajorityJudgmentParticipant):
var identifier = participant.name
if not __participants_index.has(identifier):
__participants_index[identifier] = participant
assert(
__participants_index[identifier] == participant,
"Participants index should be consistent."
)
func get_participants() -> Array:
var participants := Array()
for judgment in judgments:

Loading…
Cancel
Save