github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/internal/xslices/diff.go (about) 1 package xslices 2 3 func Diff[T any](from, to []T, cmp func(lhs, rhs T) int) (steady, added, dropped []T) { 4 steady = make([]T, 0, min(len(to), len(from))) 5 added = make([]T, 0, len(to)) 6 dropped = make([]T, 0, len(from)) 7 8 to = SortCopy(to, cmp) 9 from = SortCopy(from, cmp) 10 11 for i, j := 0, 0; ; { 12 switch { 13 case i == len(from) && j == len(to): 14 return steady, added, dropped 15 case i == len(from) && j < len(to): 16 added = append(added, to[j]) 17 j++ 18 case i < len(from) && j == len(to): 19 dropped = append(dropped, from[i]) 20 i++ 21 default: 22 cmp := cmp(from[i], to[j]) 23 switch { 24 case cmp < 0: 25 dropped = append(dropped, from[i]) 26 i++ 27 case cmp > 0: 28 added = append(added, to[j]) 29 j++ 30 default: 31 steady = append(steady, from[i]) 32 i++ 33 j++ 34 } 35 } 36 } 37 }