github.com/altipla-consulting/ravendb-go-client@v0.1.3/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  }