FIR: Refactor CandidateCollector
This commit is contained in:
+6
-23
@@ -17,49 +17,32 @@ open class CandidateCollector(
|
|||||||
var currentApplicability = CandidateApplicability.HIDDEN
|
var currentApplicability = CandidateApplicability.HIDDEN
|
||||||
private set
|
private set
|
||||||
|
|
||||||
private var currentGroup = TowerGroup.Start
|
private var bestGroup = TowerGroup.Last
|
||||||
|
|
||||||
fun newDataSet() {
|
fun newDataSet() {
|
||||||
groupNumbers.clear()
|
groupNumbers.clear()
|
||||||
candidates.clear()
|
candidates.clear()
|
||||||
currentApplicability = CandidateApplicability.HIDDEN
|
currentApplicability = CandidateApplicability.HIDDEN
|
||||||
|
bestGroup = TowerGroup.Last
|
||||||
}
|
}
|
||||||
|
|
||||||
open fun consumeCandidate(group: TowerGroup, candidate: Candidate): CandidateApplicability {
|
open fun consumeCandidate(group: TowerGroup, candidate: Candidate): CandidateApplicability {
|
||||||
val applicability = resolutionStageRunner.processCandidate(candidate)
|
val applicability = resolutionStageRunner.processCandidate(candidate)
|
||||||
|
|
||||||
if (applicability > currentApplicability) {
|
if (applicability > currentApplicability || (applicability == currentApplicability && group < bestGroup)) {
|
||||||
groupNumbers.clear()
|
|
||||||
candidates.clear()
|
candidates.clear()
|
||||||
currentApplicability = applicability
|
currentApplicability = applicability
|
||||||
currentGroup = group
|
bestGroup = group
|
||||||
}
|
}
|
||||||
|
|
||||||
if (applicability == currentApplicability) {
|
if (applicability == currentApplicability && group == bestGroup) {
|
||||||
candidates.add(candidate)
|
candidates.add(candidate)
|
||||||
groupNumbers.add(group)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return applicability
|
return applicability
|
||||||
}
|
}
|
||||||
|
|
||||||
fun bestCandidates(): List<Candidate> {
|
fun bestCandidates() = candidates
|
||||||
if (groupNumbers.isEmpty()) return emptyList()
|
|
||||||
if (groupNumbers.size == 1) return candidates
|
|
||||||
val result = mutableListOf<Candidate>()
|
|
||||||
var bestGroup = groupNumbers.first()
|
|
||||||
for ((index, candidate) in candidates.withIndex()) {
|
|
||||||
val group = groupNumbers[index]
|
|
||||||
if (bestGroup > group) {
|
|
||||||
bestGroup = group
|
|
||||||
result.clear()
|
|
||||||
}
|
|
||||||
if (bestGroup == group) {
|
|
||||||
result.add(candidate)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
fun isSuccess(): Boolean {
|
fun isSuccess(): Boolean {
|
||||||
return currentApplicability >= CandidateApplicability.SYNTHETIC_RESOLVED
|
return currentApplicability >= CandidateApplicability.SYNTHETIC_RESOLVED
|
||||||
|
|||||||
Reference in New Issue
Block a user