49 lines
1.2 KiB
Go
49 lines
1.2 KiB
Go
package engine
|
|
|
|
type diffSensitivity struct {
|
|
prefixes pathPrefixIndex
|
|
pointers []string
|
|
}
|
|
|
|
func newDiffSensitivity(left, right map[string]bool) *diffSensitivity {
|
|
sensitivity := &diffSensitivity{}
|
|
seen := make(map[string]struct{}, len(left)+len(right))
|
|
for _, classifications := range []map[string]bool{left, right} {
|
|
for pointer, classified := range classifications {
|
|
if !classified {
|
|
continue
|
|
}
|
|
if _, found := seen[pointer]; found {
|
|
continue
|
|
}
|
|
seen[pointer] = struct{}{}
|
|
id := len(sensitivity.pointers)
|
|
sensitivity.pointers = append(sensitivity.pointers, pointer)
|
|
sensitivity.prefixes.insert(pointer, id)
|
|
}
|
|
}
|
|
return sensitivity
|
|
}
|
|
|
|
func (sensitivity *diffSensitivity) isSensitiveAtOrAbove(pointer string) bool {
|
|
if sensitivity == nil {
|
|
return false
|
|
}
|
|
found := false
|
|
sensitivity.prefixes.visitAncestors(pointer, func(int) { found = true })
|
|
return found
|
|
}
|
|
|
|
func (sensitivity *diffSensitivity) hasStrictDescendant(pointer string) bool {
|
|
if sensitivity == nil {
|
|
return false
|
|
}
|
|
found := false
|
|
sensitivity.prefixes.visitDescendants(pointer, func(id int) {
|
|
if sensitivity.pointers[id] != pointer {
|
|
found = true
|
|
}
|
|
})
|
|
return found
|
|
}
|