diff options
Diffstat (limited to 'tests/internal/utils/slice.go')
-rw-r--r-- | tests/internal/utils/slice.go | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/tests/internal/utils/slice.go b/tests/internal/utils/slice.go new file mode 100644 index 0000000..85821f5 --- /dev/null +++ b/tests/internal/utils/slice.go @@ -0,0 +1,37 @@ +package utils + +import ( + "fmt" + "reflect" +) + +// AnySliceToInterfaceSlice takes a slice of type []T for any T and returns a slice of type []interface{} containing +// the same elements, somewhat like casting []T to []interface{}. +func AnySliceToInterfaceSlice(in interface{}) []interface{} { + v := reflect.ValueOf(in) + if v.Kind() != reflect.Slice { + panic(fmt.Errorf("AnySliceToInterfaceSlice() called on %T instead of a slice type", in)) + } + + out := make([]interface{}, v.Len()) + for i := 0; i < v.Len(); i++ { + out[i] = v.Index(i).Interface() + } + return out +} + +func SliceSubsets(in ...string) [][]string { + result := make([][]string, 0, 1<<len(in)) + + for bitset := 0; bitset < (1 << len(in)); bitset++ { + var subset []string + for i := 0; i < len(in); i++ { + if bitset&(1<<i) != 0 { + subset = append(subset, in[i]) + } + } + result = append(result, subset) + } + + return result +} |