48 lines
1.1 KiB
Go
48 lines
1.1 KiB
Go
package tree
|
|
|
|
func commonSnapshotForTwoPaths(ourPath []string, theirPath []string) (string, error) {
|
|
var i int
|
|
var j int
|
|
OuterLoop:
|
|
// find starting point from the right
|
|
for i = len(ourPath) - 1; i >= 0; i-- {
|
|
for j = len(theirPath) - 1; j >= 0; j-- {
|
|
// most likely there would be only one comparison, because mostly the snapshot path will start from the root for nodes
|
|
if ourPath[i] == theirPath[j] {
|
|
break OuterLoop
|
|
}
|
|
}
|
|
}
|
|
if i < 0 || j < 0 {
|
|
return "", ErrNoCommonSnapshot
|
|
}
|
|
// find last common element of the sequence moving from right to left
|
|
for i >= 0 && j >= 0 {
|
|
if ourPath[i] == theirPath[j] {
|
|
i--
|
|
j--
|
|
} else {
|
|
break
|
|
}
|
|
}
|
|
return ourPath[i+1], nil
|
|
}
|
|
|
|
func discardFromSlice[T any](elements []T, isDiscarded func(T) bool) []T {
|
|
var (
|
|
finishedIdx = 0
|
|
currentIdx = 0
|
|
)
|
|
for currentIdx < len(elements) {
|
|
if !isDiscarded(elements[currentIdx]) {
|
|
if finishedIdx != currentIdx {
|
|
elements[finishedIdx] = elements[currentIdx]
|
|
}
|
|
finishedIdx++
|
|
}
|
|
currentIdx++
|
|
}
|
|
elements = elements[:finishedIdx]
|
|
return elements
|
|
}
|