From b1374b6a08d99b02b88a3c95b20ddb6a819d6c6f Mon Sep 17 00:00:00 2001 From: astaxie Date: Thu, 12 Dec 2013 22:40:29 +0800 Subject: [PATCH] move safemap to utils & add many helpful slice function --- safemap.go => utils/safemap.go | 2 +- safemap_test.go => utils/safemap_test.go | 2 +- utils/slice.go | 131 +++++++++++++++++++++++ 3 files changed, 133 insertions(+), 2 deletions(-) rename safemap.go => utils/safemap.go (98%) rename safemap_test.go => utils/safemap_test.go (95%) diff --git a/safemap.go b/utils/safemap.go similarity index 98% rename from safemap.go rename to utils/safemap.go index 73af9e8a..27980b09 100644 --- a/safemap.go +++ b/utils/safemap.go @@ -1,4 +1,4 @@ -package beego +package utils import ( "sync" diff --git a/safemap_test.go b/utils/safemap_test.go similarity index 95% rename from safemap_test.go rename to utils/safemap_test.go index cd2a06bc..8e4eab48 100644 --- a/safemap_test.go +++ b/utils/safemap_test.go @@ -1,4 +1,4 @@ -package beego +package utils import ( "testing" diff --git a/utils/slice.go b/utils/slice.go index fe6555f1..fc59851a 100644 --- a/utils/slice.go +++ b/utils/slice.go @@ -1,5 +1,13 @@ package utils +import ( + "math/rand" + "time" +) + +type reducetype func(interface{}) interface{} +type filtertype func(interface{}) bool + func InSlice(v string, sl []string) bool { for _, vv := range sl { if vv == v { @@ -8,3 +16,126 @@ func InSlice(v string, sl []string) bool { } return false } + +func InSliceIface(v interface{}, sl []interface{}) bool { + for _, vv := range sl { + if vv == v { + return true + } + } + return false +} + +func SliceRandList(min, max int) []int { + if max < min { + min, max = max, min + } + length := max - min + 1 + t0 := time.Now() + rand.Seed(int64(t0.Nanosecond())) + list := rand.Perm(length) + for index, _ := range list { + list[index] += min + } + return list +} + +func SliceMerge(slice1, slice2 []interface{}) (c []interface{}) { + c = append(slice1, slice2...) + return +} + +func SliceReduce(slice []interface{}, a reducetype) (dslice []interface{}) { + for _, v := range slice { + dslice = append(dslice, a(v)) + } + return +} + +func SliceRand(a []interface{}) (b interface{}) { + randnum := rand.Intn(len(a)) + b = a[randnum] + return +} + +func SliceSum(intslice []int64) (sum int64) { + for _, v := range intslice { + sum += v + } + return +} + +func SliceFilter(slice []interface{}, a filtertype) (ftslice []interface{}) { + for _, v := range slice { + if a(v) { + ftslice = append(ftslice, v) + } + } + return +} + +func SliceDiff(slice1, slice2 []interface{}) (diffslice []interface{}) { + for _, v := range slice1 { + if !InSliceIface(v, slice2) { + diffslice = append(diffslice, v) + } + } + return +} + +func SliceIntersect(slice1, slice2 []interface{}) (diffslice []interface{}) { + for _, v := range slice1 { + if !InSliceIface(v, slice2) { + diffslice = append(diffslice, v) + } + } + return +} + +func SliceChunk(slice []interface{}, size int) (chunkslice [][]interface{}) { + if size >= len(slice) { + chunkslice = append(chunkslice, slice) + return + } + end := size + for i := 0; i <= (len(slice) - size); i += size { + chunkslice = append(chunkslice, slice[i:end]) + end += size + } + return +} + +func SliceRange(start, end, step int64) (intslice []int64) { + for i := start; i <= end; i += step { + intslice = append(intslice, i) + } + return +} + +func SlicePad(slice []interface{}, size int, val interface{}) []interface{} { + if size <= len(slice) { + return slice + } + for i := 0; i < (size - len(slice)); i++ { + slice = append(slice, val) + } + return slice +} + +func SliceUnique(slice []interface{}) (uniqueslice []interface{}) { + for _, v := range slice { + if !InSliceIface(v, uniqueslice) { + uniqueslice = append(uniqueslice, v) + } + } + return +} + +func SliceShuffle(slice []interface{}) []interface{} { + for i := 0; i < len(slice); i++ { + a := rand.Intn(len(slice)) + b := rand.Intn(len(slice)) + slice[a], slice[b] = slice[b], slice[a] + } + return slice +}