Documentation
¶
Overview ¶
Example (CustomType) ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
type CustomSliceType []int
func main() {
var vs CustomSliceType
var o CustomSliceType
_ = o
o = slicekit.Clone(vs)
slicekit.Insert(&vs, 0, 1, 2, 3)
slicekit.Set(vs, 0, 42)
slicekit.Delete(&vs, -1) // pop
o = slicekit.Filter(vs, func(v int) bool { return true })
o, _ = slicekit.FilterErr(vs, func(v int) (bool, error) { return true, nil })
slicekit.GroupBy(vs, func(n int) int { return n })
o = slicekit.Merge(vs, vs)
_, _ = slicekit.Pop(&vs)
_, _ = slicekit.PopAt(&vs, -1)
}
Index ¶
- func AnyOf[T any](vs []T, filter func(T) bool) bool
- func Batch[T any](vs []T, size int) [][]T
- func Clone[S ~[]T, T any](src S) S
- func Contains[T comparable](vs []T, v T) booldeprecated
- func Delete[S ~[]T, T any](vs *S, index int) bool
- func Filter[S ~[]T, T any](s S, filter func(v T) bool) S
- func FilterErr[S ~[]T, T any](s S, filter func(v T) (bool, error)) (S, error)
- func Find[T any](vs []T, by func(T) bool) (T, bool)
- func First[T any](vs []T) (T, bool)
- func GroupBy[S ~[]T, ID comparable, T any](vs S, by func(v T) ID) map[ID]S
- func Insert[S ~[]T, T any](vs *S, index int, nvs ...T) bool
- func IterReverse[T any](vs []T) iter.Seq2[int, T]
- func Last[T any](vs []T) (T, bool)
- func Lookup[T any](vs []T, index int) (T, bool)
- func Map[O, I any](s []I, mapper func(I) O) []O
- func MapErr[O, I any](s []I, mapper func(I) (O, error)) ([]O, error)
- func Merge[S ~[]T, T any](slices ...S) S
- func Pop[S ~[]T, T any](vs *S) (T, bool)
- func PopAt[S ~[]T, T any](vs *S, index int) (T, bool)
- func Reduce[O, I any](s []I, initial O, reducer func(O, I) O) O
- func ReduceErr[O, I any](s []I, initial O, reducer func(O, I) (O, error)) (O, error)
- func ResolveIndex(length, index int) (int, bool)
- func Set[T any](vs []T, index int, v T) bool
- func Shift[S ~[]T, T any](vs *S) (T, bool)
- func SortBy[T any](vs []T, less func(a, b T) bool)
- func Unique[T comparable](vs []T) []T
- func UniqueBy[T any, ID comparable](vs []T, by func(T) ID) []T
- func Unshift[S ~[]T, T any](vs *S, nvs ...T)
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Batch ¶ added in v0.217.0
Example ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
vs := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
batches := slicekit.Batch(vs, 5)
_ = batches
// 0 -> []int{1, 2, 3, 4, 5}
// 1 -> []int{6, 7, 8, 9, 10}
// 2 -> []int{11, 12, 13, 14, 15}
}
func Clone ¶ added in v0.198.0
func Clone[S ~[]T, T any](src S) S
Clone creates a clone from passed src slice.
Example ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
var (
src = []string{"a", "b", "c"}
dst = slicekit.Clone(src)
)
_, _ = src, dst
}
func Contains
deprecated
added in
v0.212.0
func Contains[T comparable](vs []T, v T) bool
Contains reports if a slice contains a given value.
Deprecated: use slices.Contains
Example ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
_ = slicekit.Contains([]string{"foo", "bar", "baz"}, "bar") // true
_ = slicekit.Contains([]int{7, 42, 128}, 128) // true
_ = slicekit.Contains([]int{7, 42, 128}, 32) // false
}
func Filter ¶ added in v0.200.0
Example ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
var (
src = []string{"a", "b", "c"}
dst = slicekit.Filter(src, func(s string) bool {
return s != "c"
})
)
_ = dst // []string{"a", "b"}, nil
}
func FilterErr ¶ added in v0.226.0
Example ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
var (
src = []string{"a", "b", "c"}
dst, err = slicekit.FilterErr(src, func(s string) (bool, error) {
return s != "c", nil
})
)
_, _ = dst, err // []string{"a", "b"}, nil
}
func Find ¶ added in v0.270.0
Find will find the first matching element in a slice based on the "by" filter function.
Example ¶
package main
import (
"time"
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
type Person struct {
Name string
Birthday time.Time
}
var ps []Person
person, ok := slicekit.Find(ps, func(p Person) bool {
return p.Birthday.After(time.Date(2000, 1, 1, 12, 00, 00, 00, time.UTC))
})
_, _ = person, ok
}
func GroupBy ¶ added in v0.272.0
func GroupBy[S ~[]T, ID comparable, T any](vs S, by func(v T) ID) map[ID]S
GroupBy will group values in []T based on the group indetifier function.
Example ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
vs := []int{1, 2, 3, 4, 5}
groups := slicekit.GroupBy(vs, func(n int) string {
if n%2 == 0 {
return "even"
}
return "odd"
})
_ = groups
}
func IterReverse ¶ added in v0.302.0
Example ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
var vs = []int{1, 2, 3}
for _, v := range slicekit.IterReverse(vs) {
_ = v // 3 -> 2 -> 1
}
}
func Last ¶ added in v0.257.0
Example ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
var list = []int{1, 2, 3}
last, ok := slicekit.Last(list)
_ = ok // true
_ = last // 3
}
Example (OnEmpty) ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
var list = []string{}
last, ok := slicekit.Last(list)
_ = ok // false
_ = last // ""
}
Example (OnNil) ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
var list []byte
last, ok := slicekit.Last(list)
_ = ok // false
_ = last // 0
}
func Lookup ¶ added in v0.186.0
Example ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
vs := []int{2, 4, 8, 16}
slicekit.Lookup(vs, 0) // -> return 2, true
slicekit.Lookup(vs, 0-1) // lookup previous -> return 0, false
slicekit.Lookup(vs, 0+1) // lookup next -> return 4, true
slicekit.Lookup(vs, 0+1000) // lookup 1000th element -> return 0, false
}
func Map ¶
func Map[O, I any](s []I, mapper func(I) O) []O
Map will do a mapping from an input type into an output type.
Example ¶
package main
import (
"strconv"
"strings"
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
var x = []string{"a", "b", "c"}
_ = slicekit.Map(x, strings.ToUpper) // []string{"A", "B", "C"}
var ns = []string{"1", "2", "3"}
_, err := slicekit.MapErr[int](ns, strconv.Atoi) // []int{1, 2, 3}
if err != nil {
panic(err)
}
}
func MapErr ¶ added in v0.226.0
MapErr will do a mapping from an input type into an output type.
Example ¶
package main
import (
"strconv"
"strings"
"go.llib.dev/frameless/pkg/must"
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
var x = []string{"a", "b", "c"}
_ = must.Must(slicekit.MapErr[string](x, func(s string) (string, error) {
return strings.ToUpper(s), nil
})) // []string{"A", "B", "C"}
var ns = []string{"1", "2", "3"}
_, err := slicekit.MapErr[int](ns, strconv.Atoi) // []int{1, 2, 3}
if err != nil {
panic(err)
}
}
func Merge ¶ added in v0.188.0
func Merge[S ~[]T, T any](slices ...S) S
Merge will merge every []T slice into a single one.
Example ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
var (
a = []string{"a", "b", "c"}
b = []string{"1", "2", "3"}
c = []string{"1", "B", "3"}
out = slicekit.Merge(a, b, c)
)
_ = out // []string{"a", "b", "c", "1", "2", "3", "1", "B", "3"}
}
func Pop ¶ added in v0.257.0
Example ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
var list = []int{1, 2, 3}
v, ok := slicekit.Pop(&list)
_ = ok // true
_ = v // 3
_ = list // []int{1, 2}
}
Example (OnEmpty) ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
var list = []string{}
v, ok := slicekit.Pop(&list)
_ = ok // false
_ = v // ""
_ = list // []string{}
}
Example (OnNil) ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
var list []byte
v, ok := slicekit.Pop(&list)
_ = ok // false
_ = v // 0
_ = list // ([]byte)(nil)
}
func Reduce ¶
func Reduce[O, I any](s []I, initial O, reducer func(O, I) O) O
Reduce iterates over a slice, combining elements using the reducer function.
Example ¶
package main
import (
"fmt"
"strconv"
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
var x = []int{1, 2, 3}
got := slicekit.Reduce[string](x, "|", func(s string, i int) string {
return s + strconv.Itoa(i)
})
fmt.Println(got) // "|123"
}
func ReduceErr ¶ added in v0.226.0
ReduceErr iterates over a slice, combining elements using the reducer function.
Example ¶
package main
import (
"fmt"
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
var x = []string{"a", "b", "c"}
got, err := slicekit.ReduceErr[string](x, "|", func(o string, i string) (string, error) {
return o + i, nil
})
if err != nil {
panic(err)
}
fmt.Println(got) // "|abc"
}
func ResolveIndex ¶ added in v0.304.0
ResolveIndex returns the zero-based element position for index (negative wraps from end), It returns false for second argument if the index is out of bounds.
Example ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
var s = []string{"foo", "bar", "baz"}
_, _ = slicekit.ResolveIndex(len(s), 1) // 1, true
_, _ = slicekit.ResolveIndex(len(s), 2) // 2, true
_, _ = slicekit.ResolveIndex(len(s), -1) // 2, true
_, _ = slicekit.ResolveIndex(len(s), 3) // 3, false
}
func Shift ¶ added in v0.257.0
Example ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
var list = []int{1, 2, 3}
v, ok := slicekit.Shift(&list)
_ = ok // true
_ = v // 1
_ = list // []int{2, 3}
}
Example (OnEmpty) ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
var list = []string{}
v, ok := slicekit.Shift(&list)
_ = ok // false
_ = v // ""
_ = list // []string{}
}
Example (OnNil) ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
var list []byte
v, ok := slicekit.Shift(&list)
_ = ok // false
_ = v // 0
_ = list // ([]byte)(nil)
}
func Unique ¶ added in v0.233.0
func Unique[T comparable](vs []T) []T
Example ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
slicekit.Unique([]int{1, 2, 2, 3, 3, 3})
// -> []int{1, 2, 3}
}
func UniqueBy ¶ added in v0.269.0
func UniqueBy[T any, ID comparable](vs []T, by func(T) ID) []T
Example ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
type T struct {
ID int
Val string
}
vs := []T{
{ID: 1, Val: "foo1"},
{ID: 2, Val: "bar1"},
{ID: 2, Val: "bar2"},
{ID: 3, Val: "baz1"},
{ID: 3, Val: "baz2"},
{ID: 3, Val: "baz3"},
}
slicekit.UniqueBy(vs, func(v T) int { return v.ID })
// []T{
// {ID: 1, Val: "foo1"},
// {ID: 2, Val: "bar1"},
// {ID: 3, Val: "baz1"},
// }
}
func Unshift ¶ added in v0.257.0
func Unshift[S ~[]T, T any](vs *S, nvs ...T)
Example ¶
package main
import (
"go.llib.dev/frameless/pkg/slicekit"
)
func main() {
var list []string
_ = list // ([]string)(nil)
slicekit.Unshift(&list, "foo")
_ = list // []string{"foo"}
slicekit.Unshift(&list, "bar")
_ = list // []string{"bar", "foo"}
slicekit.Unshift(&list, "baz", "qux")
_ = list // []string{"baz", "qux", "bar", "foo"}
}
Types ¶
This section is empty.