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  }