github.com/kazu/loncha@v0.6.3/subtract.go (about) 1 package loncha 2 3 import "sort" 4 5 type subOpt struct { 6 } 7 8 func mapOfExists[T comparable](slice []T) (exists map[T]bool) { 9 10 exists = map[T]bool{} 11 for _, v := range slice { 12 exists[v] = true 13 } 14 15 return 16 } 17 18 // Sub .. subtraction between two slices. 19 func Sub[T comparable](slice1, slice2 []T, opts ...Opt[subOpt]) (result []T) { 20 21 param, fn := MergeOpts(opts...) 22 defer fn(param) 23 24 exists := mapOfExists(slice2) 25 26 for _, v := range slice1 { 27 if _, found := exists[v]; !found { 28 result = append(result, v) 29 } 30 } 31 return 32 33 } 34 35 // SubSorted ... subtraction in sorted slice 36 func SubSorted[T any, V Ordered](slice1, slice2 []T, IdentFn IdentFunc[T, V]) (result []T) { 37 38 jn := 0 39 result = make([]T, 0, len(slice2)) 40 for i, v := range slice1 { 41 key := IdentFn(slice1, i) 42 idx := sort.Search(len(slice2)-jn, func(j int) bool { 43 return IdentFn(slice2, jn+j) >= key 44 }) 45 _ = v 46 if len(slice2) <= idx { 47 result = append(result, v) 48 break 49 } 50 51 // copy before idx -1 52 if IdentFn(slice2, idx) != key { 53 result = append(result, v) 54 55 } 56 // MENTION: required ? 57 if IdentFn(slice2, idx) < key { 58 jn = idx 59 } 60 61 } 62 return result 63 64 }