Index enemy event duplicate identities
This commit is contained in:
@@ -111,6 +111,7 @@ func (n *Normalizer) Normalize(ctx context.Context, req contracts.TypedNormalize
|
||||
|
||||
type normalizedRecord struct {
|
||||
event dnd.EnemyEvent
|
||||
identity string
|
||||
inputIndex int
|
||||
}
|
||||
|
||||
@@ -127,7 +128,7 @@ func normalizeList(input dnd.EnemyEventList, order shared.SourceRefOrder, regist
|
||||
warnings := make([]contracts.Warning, 0)
|
||||
for index, inputEvent := range input.Events {
|
||||
event, nameChange, refsChanged := normalizeEvent(inputEvent, order, registry)
|
||||
records[index] = normalizedRecord{event: event, inputIndex: index}
|
||||
records[index] = normalizedRecord{event: event, identity: enemyeventmodel.CanonicalIdentity(event), inputIndex: index}
|
||||
if nameChange != nil {
|
||||
warnings = append(warnings, contracts.Warning{
|
||||
Scope: eventScope(index),
|
||||
@@ -160,7 +161,7 @@ func normalizeList(input dnd.EnemyEventList, order shared.SourceRefOrder, regist
|
||||
})
|
||||
}
|
||||
|
||||
output, duplicateWarnings := collapseDuplicates(records, order)
|
||||
output, duplicateWarnings := collapseDuplicates(records)
|
||||
warnings = append(warnings, duplicateWarnings...)
|
||||
return dnd.EnemyEventList{Events: output}, diagnostics.LimitWarnings(warnings, "enemy_events", ReasonCodeWarningsOmitted)
|
||||
}
|
||||
@@ -204,23 +205,25 @@ type duplicateGroup struct {
|
||||
removed []int
|
||||
}
|
||||
|
||||
func collapseDuplicates(records []normalizedRecord, order shared.SourceRefOrder) ([]dnd.EnemyEvent, []contracts.Warning) {
|
||||
func collapseDuplicates(records []normalizedRecord) ([]dnd.EnemyEvent, []contracts.Warning) {
|
||||
if len(records) == 0 {
|
||||
return make([]dnd.EnemyEvent, 0), nil
|
||||
}
|
||||
kept := make([]normalizedRecord, 0, len(records))
|
||||
groups := make([]duplicateGroup, 0)
|
||||
groupPositions := make(map[string][]int, len(records))
|
||||
for _, record := range records {
|
||||
match := -1
|
||||
for index := range kept {
|
||||
if enemyeventmodel.ExactEqual(order, kept[index].event, record.event) {
|
||||
match = index
|
||||
for _, groupIndex := range groupPositions[record.identity] {
|
||||
if enemyeventmodel.CanonicalExactEqual(kept[groupIndex].event, record.event) {
|
||||
match = groupIndex
|
||||
break
|
||||
}
|
||||
}
|
||||
if match < 0 {
|
||||
kept = append(kept, record)
|
||||
groups = append(groups, duplicateGroup{retainedIndex: record.inputIndex})
|
||||
groupPositions[record.identity] = append(groupPositions[record.identity], len(kept)-1)
|
||||
continue
|
||||
}
|
||||
groups[match].removed = append(groups[match].removed, record.inputIndex)
|
||||
|
||||
Reference in New Issue
Block a user