package utils import ( "log" ) // GetDiff returns two slices: elements to add and elements to remove func GetDiff[T comparable](current, newm []T) ([]T, []T) { log.Println(current, newm) // Use a single map with an int to track state: // 1: only in current, 2: only in new, 3: in both presence := make(map[T]int) // Mark all items in current as 1 for _, item := range current { presence[item] = 1 } // Update map based on newm: add 2 if not present, set to 3 if present for _, item := range newm { if val, exists := presence[item]; exists { presence[item] = val + 2 // 1 -> 3 (both) } else { presence[item] = 2 // only in new } } var toAdd, toRemove []T // Iterate once over the map to build results for item, state := range presence { switch state { case 1: // Only in current -> remove toRemove = append(toRemove, item) case 2: // Only in new -> add toAdd = append(toAdd, item) // case 3: in both, do nothing } } return toAdd, toRemove }