| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- package generics
- import (
- "golang.org/x/exp/constraints"
- )
- // Pops the last element from the slice and returns it. Panics if the slice is empty, or if the
- // slice is nil.
- func SlicePop[T any](slice *[]T) T {
- lastIndex := len(*slice) - 1
- last := (*slice)[lastIndex]
- *slice = (*slice)[:lastIndex]
- return last
- }
- func MakeSliceWithLength[T any, L constraints.Integer](slice *[]T, length L) {
- *slice = make([]T, length)
- }
- func MakeSliceWithCap[T any, L constraints.Integer](slice *[]T, cap L) {
- *slice = make([]T, 0, cap)
- }
- func Reversed[T any](slice []T) []T {
- reversed := make([]T, len(slice))
- for i := range reversed {
- reversed[i] = slice[len(slice)-1-i]
- }
- return reversed
- }
- func Singleton[T any](t T) []T {
- return []T{t}
- }
- // I take it there's no way to do this with a generic return slice element type.
- func ConvertToSliceOfAny[T any](ts []T) (ret []any) {
- ret = make([]any, 0, len(ts))
- for _, t := range ts {
- ret = append(ret, t)
- }
- return
- }
- func ReverseSlice[T any](slice []T) {
- for i := 0; i < len(slice)/2; i++ {
- slice[i], slice[len(slice)-1-i] = slice[len(slice)-1-i], slice[i]
- }
- }
- func SliceTake[T any](n int, slice []T) []T {
- return slice[:Min(n, len(slice))]
- }
- func SliceDrop[T any](n int, slice []T) []T {
- return slice[Min(n, len(slice)):]
- }
- func SliceGet[T any, I constraints.Integer](slice []T, index I) (ret Option[T]) {
- if int(index) < len(slice) {
- ret = Some(slice[index])
- }
- return
- }
- // Surely you should just pass iterator functions around instead. Go sux.
- func SliceMap[From, To any](froms []From, convert func(From) To) []To {
- tos := make([]To, 0, len(froms))
- for _, from := range froms {
- tos = append(tos, convert(from))
- }
- return tos
- }
|