github.com/ravendb/ravendb-go-client@v0.0.0-20240229102137-4474ee7aa0fa/string_array.go (about) 1 package ravendb 2 3 import ( 4 "sort" 5 "strings" 6 ) 7 8 func stringArrayRemoveNoCase(a []string, s string) []string { 9 n := len(a) 10 if n == 0 { 11 return a 12 } 13 var toRemove []int 14 for i, s1 := range a { 15 if strings.EqualFold(s1, s) { 16 toRemove = append(toRemove, i) 17 } 18 } 19 return stringArrayRemoveAtIndexes(a, toRemove) 20 } 21 22 func stringArrayRemove(pa *[]string, s string) bool { 23 a := *pa 24 n := len(a) 25 if n == 0 { 26 return false 27 } 28 29 var toRemove []int 30 for i, s1 := range a { 31 if s1 == s { 32 toRemove = append(toRemove, i) 33 } 34 } 35 if len(toRemove) == 0 { 36 return false 37 } 38 *pa = stringArrayRemoveAtIndexes(a, toRemove) 39 return true 40 } 41 42 func stringArrayCopy(a []string) []string { 43 if len(a) == 0 { 44 return nil 45 } 46 return append([]string{}, a...) 47 } 48 49 // return a1 - a2 50 func stringArraySubtract(a1, a2 []string) []string { 51 if len(a2) == 0 { 52 return a1 53 } 54 if len(a1) == 0 { 55 return nil 56 } 57 diff := make(map[string]struct{}) 58 for _, k := range a1 { 59 diff[k] = struct{}{} 60 } 61 for _, k := range a2 { 62 delete(diff, k) 63 } 64 if len(diff) == 0 { 65 return nil 66 } 67 // TODO: pre-allocate 68 var res []string 69 for k := range diff { 70 res = append(res, k) 71 } 72 return res 73 } 74 75 func stringArrayContains(a []string, s string) bool { 76 for _, el := range a { 77 if el == s { 78 return true 79 } 80 } 81 return false 82 } 83 84 // stringArrayContainsNoCase returns true if a contains s using case-insensitive 85 // comparison 86 func stringArrayContainsNoCase(a []string, s string) bool { 87 for _, el := range a { 88 if strings.EqualFold(el, s) { 89 return true 90 } 91 } 92 return false 93 } 94 95 func stringArrayRemoveAtIndexes(a []string, toRemove []int) []string { 96 if len(toRemove) == 0 { 97 return a 98 } 99 // remove from the end so that index in toRemove isn't invalidated 100 // by changing the array 101 n := len(a) 102 lastIdx := n - 1 103 for i := len(toRemove) - 1; i >= 0; i-- { 104 idx := toRemove[i] 105 // remove by replacing with element from end of array 106 a[idx] = a[lastIdx] 107 lastIdx-- 108 } 109 return a[:n-len(toRemove)] 110 } 111 112 // stringArrayRemoveDuplicates removes duplicate strings from a 113 func stringArrayRemoveDuplicates(a []string) []string { 114 n := len(a) 115 if n < 2 { 116 return a 117 } 118 sort.Strings(a) 119 var toRemove []int 120 prev := a[0] 121 for i := 1; i < n; i++ { 122 if a[i] == prev { 123 toRemove = append(toRemove, i) 124 continue 125 } 126 prev = a[i] 127 } 128 return stringArrayRemoveAtIndexes(a, toRemove) 129 } 130 131 // stringArrayRemoveDuplicatesNoCase removes duplicate strings from a, ignoring case 132 func stringArrayRemoveDuplicatesNoCase(a []string) []string { 133 n := len(a) 134 if n < 2 { 135 return a 136 } 137 sort.Slice(a, func(i, j int) bool { 138 s1 := strings.ToLower(a[i]) 139 s2 := strings.ToLower(a[j]) 140 return s1 < s2 141 }) 142 var toRemove []int 143 prev := strings.ToLower(a[0]) 144 for i := 1; i < n; i++ { 145 s := strings.ToLower(a[i]) 146 if s == prev { 147 toRemove = append(toRemove, i) 148 continue 149 } 150 prev = s 151 } 152 return stringArrayRemoveAtIndexes(a, toRemove) 153 }