summaryrefslogtreecommitdiffstats
path: root/pkg/utils/slice.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/utils/slice.go')
-rw-r--r--pkg/utils/slice.go118
1 files changed, 118 insertions, 0 deletions
diff --git a/pkg/utils/slice.go b/pkg/utils/slice.go
new file mode 100644
index 000000000..f536ea056
--- /dev/null
+++ b/pkg/utils/slice.go
@@ -0,0 +1,118 @@
+package utils
+
+// IncludesString if the list contains the string
+func IncludesString(list []string, a string) bool {
+ for _, b := range list {
+ if b == a {
+ return true
+ }
+ }
+ return false
+}
+
+// IncludesInt if the list contains the Int
+func IncludesInt(list []int, a int) bool {
+ for _, b := range list {
+ if b == a {
+ return true
+ }
+ }
+ return false
+}
+
+// NextIndex returns the index of the element that comes after the given number
+func NextIndex(numbers []int, currentNumber int) int {
+ for index, number := range numbers {
+ if number > currentNumber {
+ return index
+ }
+ }
+ return len(numbers) - 1
+}
+
+// PrevIndex returns the index that comes before the given number, cycling if we reach the end
+func PrevIndex(numbers []int, currentNumber int) int {
+ end := len(numbers) - 1
+ for i := end; i >= 0; i-- {
+ if numbers[i] < currentNumber {
+ return i
+ }
+ }
+ return 0
+}
+
+// UnionInt returns the union of two int arrays
+func UnionInt(a, b []int) []int {
+ m := make(map[int]bool)
+
+ for _, item := range a {
+ m[item] = true
+ }
+
+ for _, item := range b {
+ if _, ok := m[item]; !ok {
+ // this does not mutate the original a slice
+ // though it does mutate the backing array I believe
+ // but that doesn't matter because if you later want to append to the
+ // original a it must see that the backing array has been changed
+ // and create a new one
+ a = append(a, item)
+ }
+ }
+ return a
+}
+
+// DifferenceInt returns the difference of two int arrays
+func DifferenceInt(a, b []int) []int {
+ result := []int{}
+ m := make(map[int]bool)
+
+ for _, item := range b {
+ m[item] = true
+ }
+
+ for _, item := range a {
+ if _, ok := m[item]; !ok {
+ result = append(result, item)
+ }
+ }
+ return result
+}
+
+// NextIntInCycle returns the next int in a slice, returning to the first index if we've reached the end
+func NextIntInCycle(sl []int, current int) int {
+ for i, val := range sl {
+ if val == current {
+ if i == len(sl)-1 {
+ return sl[0]
+ }
+ return sl[i+1]
+ }
+ }
+ return sl[0]
+}
+
+// PrevIntInCycle returns the prev int in a slice, returning to the first index if we've reached the end
+func PrevIntInCycle(sl []int, current int) int {
+ for i, val := range sl {
+ if val == current {
+ if i > 0 {
+ return sl[i-1]
+ }
+ return sl[len(sl)-1]
+ }
+ }
+ return sl[len(sl)-1]
+}
+
+func StringArraysOverlap(strArrA []string, strArrB []string) bool {
+ for _, first := range strArrA {
+ for _, second := range strArrB {
+ if first == second {
+ return true
+ }
+ }
+ }
+
+ return false
+}