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  }