Documentation ¶
Index ¶
- func Abs[T number](x T) T
- func Difference[T comparable](s1, s2 []T) []T
- func DoThenRepeat(ctx context.Context, interval time.Duration, fn func(), waitForPrevious bool) func()
- func FindSliceDeltas[T any, K comparable](s1, s2 []T, key func(T) K, equal func(T, T) bool, ...) (added, removed, updated, unchanged []T)
- func Include[T comparable](list []T, ele T) bool
- func Index[T comparable](list []T, ele T) int
- func Intersection[T comparable](ss ...[]T) []T
- func Keys[K comparable, V any](mapping map[K]V) []K
- func LastIndex[T comparable](list []T, ele T) int
- func Map[T any](list []T, fn func(v T) T) []T
- func MapTo[T any, R any](list []T, fn func(v T) R) []R
- func Max[T number](a, b T) T
- func MergeSlice[T any](ss ...[]T) []T
- func Min[T number](a, b T) T
- func NewFalse() *bool
- func NewTrue() *bool
- func RandomString(length int, charset ...string) string
- func Reduce[T any, R any](list []T, fn func(sum R, item T, index int) R, initial R) R
- func ReduceRight[T any, R any](list []T, fn func(sum R, item T, index int) R, initial R) R
- func RepeatTask(ctx context.Context, interval time.Duration, fn func(), waitForPrevious bool) func()
- func Shuffle[T any](list []T)
- func SortSlice[S ~[]E, E constraints.Ordered](s S)
- func Union[T comparable](ss ...[]T) []T
- func UniqSlice[T comparable](ss ...[]T) []T
- func Values[K comparable, V any](mapping map[K]V) []V
- type FindSliceDeltasOptions
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Abs ¶
func Abs[T number](x T) T
Abs returns the absolute value of x.
Special cases are:
Abs(±Inf) = +Inf Abs(NaN) = NaN
This implementation is from https://go-review.googlesource.com/c/go/+/436296
Example ¶
xFloat64 := Abs(float64(-2)) fmt.Printf("%.1f, %T\n", xFloat64, xFloat64) yFloat64 := Abs(float64(2)) fmt.Printf("%.1f, %T\n", yFloat64, yFloat64) xInt := Abs(int(-2)) fmt.Printf("%d, %T\n", xInt, xInt) yInt := Abs(int(2)) fmt.Printf("%d, %T\n", yInt, yInt) type int64Type int64 xTypeInt64 := Abs(int64Type(-2)) fmt.Printf("%d, %T\n", xTypeInt64, xTypeInt64) yTypeInt64 := Abs(int64Type(2)) fmt.Printf("%d, %T\n", yTypeInt64, yTypeInt64)
Output: 2.0, float64 2.0, float64 2, int 2, int 2, lol.int64Type 2, lol.int64Type
func Difference ¶
func Difference[T comparable](s1, s2 []T) []T
Difference returns the difference of s1-s2.
Play: https://go.dev/play/p/fB7HJFYbsCB
Example ¶
res1 := Difference([]int{1, 4, 7, 11}, []int{4, 1, 2}) res2 := Difference([]int{9, 10}, []int{4, 7, 9, 10}) sort.Ints(res1) sort.Ints(res2) fmt.Println(res1) fmt.Println(res2)
Output: [7 11] []
func DoThenRepeat ¶ added in v1.2.0
func DoThenRepeat(ctx context.Context, interval time.Duration, fn func(), waitForPrevious bool) func()
DoThenRepeat executes a given function periodically at a specified interval until the context is done. Parameters:
- ctx: A context to control the lifetime of the function's execution. When the context is canceled, the function stops executing.
- interval: The duration between consecutive function executions.
- fn: The function to be executed periodically.
- waitForPrevious: A boolean flag indicating whether to wait for the previous execution to complete before starting a new one. If true, the function executes sequentially. If false, the function starts a new execution even if the previous one is still running.
Returns a function that blocks until all the function executions are completed.
The function runs asynchronously in a goroutine, and the first execution occurs immediately upon calling DoThenRepeat.
Play: https://go.dev/play/p/aF2fcqmJKAZ
Example ¶
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt) i := atomic.Int32{} wait := DoThenRepeat(ctx, time.Millisecond*400, func() { i.Add(1) time.Sleep(300 * time.Millisecond) }, false) time.Sleep(1 * time.Second) cancel() wait() fmt.Println(i.Load() >= 2)
Output: true
func FindSliceDeltas ¶ added in v1.1.0
func FindSliceDeltas[T any, K comparable]( s1, s2 []T, key func(T) K, equal func(T, T) bool, options ...FindSliceDeltasOptions[T, K], ) (added, removed, updated, unchanged []T)
FindSliceDeltas finds the added, removed, updated and unchanged items between s1 and s2. The key function is used to get the key of the item, and the equal function is used to compare the item. These two functions are required!
The added, updated, unchanged slice will use s2's item, and the removed slice will use s1's item. if you provide the Copy function in FindSliceDeltasOptions, the all return slice will be copied through the Copy function.
Play: https://go.dev/play/p/1-AFrP7CIGQ
Example ¶
added, removed, updated, unchanged := FindSliceDeltas([]int{1, 4, 7, 11}, []int{4, 1, 2}, func(t int) int { return t }, func(v1 int, v2 int) bool { return v1 == v2 }, FindSliceDeltasOptions[int, int]{Compare: func(a, b int) int { return a - b }}) fmt.Println(added) fmt.Println(removed) fmt.Println(updated) fmt.Println(unchanged)
Output: [2] [7 11] [] [1 4]
func Include ¶
func Include[T comparable](list []T, ele T) bool
Include returns true if the slice includes the element.
Play: https://go.dev/play/p/6VW3_rG4AIX
Example ¶
res1 := Include([]int{1, 7, 3, 4}, 3) res2 := Include([]string{"1", "7", "3", "4"}, "x") fmt.Println(res1) fmt.Println(res2)
Output: true false
func Index ¶
func Index[T comparable](list []T, ele T) int
Index returns the index of elements in the slice, or -1 if not found.
Play: https://go.dev/play/p/4ZBiqNvs-Vc
Example ¶
res1 := Index([]int{1, 7, 3, 4, 3}, 3) res2 := Index([]string{"1", "7", "3", "4"}, "x") fmt.Println(res1) fmt.Println(res2)
Output: 2 -1
func Intersection ¶
func Intersection[T comparable](ss ...[]T) []T
Intersection returns the intersection of multiple slices.
Play: https://go.dev/play/p/tqI_pu_-khj
Example ¶
res1 := Intersection([]int{1, 4, 7}, []int{4, 1, 2}, []int{7, 1, 3}) res2 := Intersection([]int{4, 7, 9, 10}, []int{4, 7, 9, 10}) sort.Ints(res1) sort.Ints(res2) fmt.Println(res1) fmt.Println(res2)
Output: [1] [4 7 9 10]
func Keys ¶
func Keys[K comparable, V any](mapping map[K]V) []K
Keys creates an array of the map keys.
Play: https://go.dev/play/p/JlVhmI6ThnL
Example ¶
res1 := Keys(map[int]struct{}{ 1: {}, 7: {}, 3: {}, 4: {}, }) sort.Ints(res1) res2 := Keys(map[string]struct{}{ "a": {}, "b": {}, "1": {}, "2": {}, }) sort.Strings(res2) fmt.Println(res1) fmt.Println(res2)
Output: [1 3 4 7] [1 2 a b]
func LastIndex ¶
func LastIndex[T comparable](list []T, ele T) int
LastIndex is same as Index, but it returns the last index.
Play: https://go.dev/play/p/TL2YNWHvDqw
Example ¶
res1 := LastIndex([]int{1, 7, 3, 4, 3}, 3) res2 := LastIndex([]string{"1", "7", "3", "4"}, "x") fmt.Println(res1) fmt.Println(res2)
Output: 4 -1
func Map ¶
func Map[T any](list []T, fn func(v T) T) []T
Map maps a function over a slice.
Play: https://go.dev/play/p/ePBYrs1YqDz
Example ¶
res := Map([]int{1, 3, 5}, func(i int) int { return i * 2 }) fmt.Println(res)
Output: [2 6 10]
func MapTo ¶
MapTo is same as Map, but it can return another type of slice.
Special case: when fn is nil, it returns the empty slice.
PLay: https://go.dev/play/p/wClBNz0Fjxt
Example ¶
type user struct { name string age uint8 } res := MapTo([]user{ {"Heisenberg", 35}, {"Hank", 32}, {"Saul", 33}, }, func(u user) string { return u.name }) fmt.Println(res)
Output: [Heisenberg Hank Saul]
func Max ¶
func Max[T number](a, b T) T
Max returns the largest of x and y.
Example ¶
fmt.Println(Max(3, 1)) fmt.Println(Max(3.3, -1.0))
Output: 3 3.3
func MergeSlice ¶
func MergeSlice[T any](ss ...[]T) []T
MergeSlice merges multiple slices without removing duplicates or shuffling the elements.
Play: https://go.dev/play/p/ARhoTg83WK8
Example ¶
res1 := MergeSlice([]int{1, 4, 7}, []int{2, 5, 8}, []int{3, 6, 9}) res2 := MergeSlice([]int{1}, []int{2, 5, 8}, []int{3, 6}, []int{4, 7, 9, 10}) fmt.Println(res1) fmt.Println(res2)
Output: [1 4 7 2 5 8 3 6 9] [1 2 5 8 3 6 4 7 9 10]
func Min ¶
func Min[T number](a, b T) T
Min returns the smallest of x and y.
Example ¶
fmt.Println(Min(3, 1)) fmt.Println(Min(3.3, -1.0))
Output: 1 -1
func NewTrue ¶
func NewTrue() *bool
NewTrue returns a pointer to a new bool with true.
Example ¶
fmt.Println(*NewTrue()) fmt.Println(*NewFalse())
Output: true false
func RandomString ¶ added in v1.3.0
RandomString generates a random string with a given length. If a charset is provided, it will be used to generate the random string. Otherwise, the default charset will be used.
Play: https://go.dev/play/p/jpdJyEVdLcq
Example ¶
res1 := RandomString(8) res2 := RandomString(8, "8") fmt.Println(len(res1), len(res2)) fmt.Println(res2)
Output: 8 8 88888888
func Reduce ¶
Reduce accumulates and combines elements through a fn into a single value.
Special case: when fn is nil, it returns the initial value
Play: https://go.dev/play/p/gI8Mcvk4NGr
Example ¶
res1 := Reduce([]int{1, 7, 3, 4}, func(s float64, v, i int) float64 { return s * float64(v) }, 2) res2 := Reduce([]string{"1", "7", "3", "4"}, func(s, v string, i int) string { return fmt.Sprintf("%s %d.%s", s, i, v) }, "start:") fmt.Println(res1) fmt.Println(res2)
Output: 168 start: 0.1 1.7 2.3 3.4
func ReduceRight ¶
ReduceRight is like the Reduce, but the order is reserve.
Special case: when fn is nil, it returns the initial value
Play: https://go.dev/play/p/n1rGGeg1KFf
Example ¶
res1 := ReduceRight([]int{1, 7, 3, 4}, func(s float64, v, i int) float64 { return s * float64(v) }, 2) res2 := ReduceRight([]string{"1", "7", "3", "4"}, func(s, v string, i int) string { return fmt.Sprintf("%s %d.%s", s, i, v) }, "reverse:") fmt.Println(res1) fmt.Println(res2)
Output: 168 reverse: 3.4 2.3 1.7 0.1
func RepeatTask ¶ added in v1.2.0
func RepeatTask(ctx context.Context, interval time.Duration, fn func(), waitForPrevious bool) func()
RepeatTask executes a given function periodically at a specified interval until the context is done. Parameters:
- ctx: A context to control the lifetime of the function's execution. When the context is canceled, the function stops executing.
- interval: The duration between consecutive function executions.
- fn: The function to be executed periodically.
- waitForPrevious: A boolean flag indicating whether to wait for the previous execution to complete before starting a new one. If true, the function executes sequentially. If false, the function starts a new execution even if the previous one is still running.
Returns a function that blocks until all the function executions are completed.
The function runs asynchronously in a goroutine, and the first execution occurs after the first interval has elapsed.
Play: https://go.dev/play/p/ldnDL__QNlh
Example ¶
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt) i := atomic.Int32{} wait := RepeatTask(ctx, time.Millisecond*400, func() { i.Add(1) time.Sleep(300 * time.Millisecond) }, false) time.Sleep(1 * time.Second) cancel() wait() fmt.Println(i.Load() >= 2)
Output: true
func Shuffle ¶
func Shuffle[T any](list []T)
Shuffle shuffles a slice for random order. Implement based on rand.Shuffle
Play: https://go.dev/play/p/A2yeiJDWIHp
Example ¶
s := []string{"a", "b", "c", "d"} Shuffle(s) fmt.Println(s)
Output:
func SortSlice ¶
func SortSlice[S ~[]E, E constraints.Ordered](s S)
SortSlice sorts a slice. Just a wrapper for slices.Sort.
Example ¶
s := []float64{3, 6, 1, math.NaN(), 9, math.NaN()} fmt.Println(s) SortSlice(s) fmt.Println(s)
Output: [3 6 1 NaN 9 NaN] [NaN NaN 1 3 6 9]
func UniqSlice ¶
func UniqSlice[T comparable](ss ...[]T) []T
UniqSlice merges multiple slices with removing duplicates the elements.
Play: https://go.dev/play/p/clvg0gFoBQs
Example ¶
res1 := UniqSlice([]int{1, 4, 7}, []int{4, 1, 2}, []int{7, 1, 3}) res2 := UniqSlice([]int{4, 7, 9, 10}) fmt.Println(res1) fmt.Println(res2)
Output: [1 4 7 2 3] [4 7 9 10]
func Values ¶
func Values[K comparable, V any](mapping map[K]V) []V
Values creates an array of the map values.
Play: https://go.dev/play/p/YQrxuIzbimT
Example ¶
res1 := Values(map[int]int{ 1: 3, 7: 5, 3: 9, 4: 7, }) sort.Ints(res1) res2 := Values(map[int]string{ 1: "3", 7: "5", 3: "9", 4: "7", }) sort.Strings(res2) fmt.Println(res1) fmt.Println(res2)
Output: [3 5 7 9] [3 5 7 9]
Types ¶
type FindSliceDeltasOptions ¶ added in v1.1.0
type FindSliceDeltasOptions[T any, K comparable] struct { // Copy realizes deep copy, confirm the FindSliceDeltas return the new slice Copy func(T) T // Compare should return a negative number when a < b, a positive number when // a > b and zero when a == b. Compare func(a, b T) int }