mirror of
https://github.com/anyproto/any-sync.git
synced 2025-06-08 05:57:03 +09:00
120 lines
2.2 KiB
Go
120 lines
2.2 KiB
Go
package slice
|
|
|
|
import (
|
|
"hash/fnv"
|
|
"math/rand"
|
|
"sort"
|
|
)
|
|
|
|
func DifferenceRemovedAdded(a, b []string) (removed []string, added []string) {
|
|
var amap = map[string]struct{}{}
|
|
var bmap = map[string]struct{}{}
|
|
|
|
for _, item := range a {
|
|
amap[item] = struct{}{}
|
|
}
|
|
|
|
for _, item := range b {
|
|
if _, exists := amap[item]; !exists {
|
|
added = append(added, item)
|
|
}
|
|
bmap[item] = struct{}{}
|
|
}
|
|
|
|
for _, item := range a {
|
|
if _, exists := bmap[item]; !exists {
|
|
removed = append(removed, item)
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func FindPos(s []string, v string) int {
|
|
for i, sv := range s {
|
|
if sv == v {
|
|
return i
|
|
}
|
|
}
|
|
return -1
|
|
}
|
|
|
|
// Difference returns the elements in `a` that aren't in `b`.
|
|
func Difference(a, b []string) []string {
|
|
var diff = make([]string, 0, len(a))
|
|
for _, a1 := range a {
|
|
if FindPos(b, a1) == -1 {
|
|
diff = append(diff, a1)
|
|
}
|
|
}
|
|
return diff
|
|
}
|
|
|
|
func Insert(s []string, pos int, v ...string) []string {
|
|
if len(s) <= pos {
|
|
return append(s, v...)
|
|
}
|
|
if pos == 0 {
|
|
return append(v, s[pos:]...)
|
|
}
|
|
return append(s[:pos], append(v, s[pos:]...)...)
|
|
}
|
|
|
|
// Remove reuses provided slice capacity. Provided s slice should not be used after without reassigning to the func return!
|
|
func Remove(s []string, v string) []string {
|
|
var n int
|
|
for _, x := range s {
|
|
if x != v {
|
|
s[n] = x
|
|
n++
|
|
}
|
|
}
|
|
return s[:n]
|
|
}
|
|
|
|
func Filter(vals []string, cond func(string) bool) []string {
|
|
var result = make([]string, 0, len(vals))
|
|
for i := range vals {
|
|
if cond(vals[i]) {
|
|
result = append(result, vals[i])
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
|
|
func GetRandomString(s []string, seed string) string {
|
|
rand.Seed(int64(hash(seed)))
|
|
return s[rand.Intn(len(s))]
|
|
}
|
|
|
|
func hash(s string) uint64 {
|
|
h := fnv.New64a()
|
|
h.Write([]byte(s))
|
|
return h.Sum64()
|
|
}
|
|
|
|
func SortedEquals(s1, s2 []string) bool {
|
|
if len(s1) != len(s2) {
|
|
return false
|
|
}
|
|
for i := range s1 {
|
|
if s1[i] != s2[i] {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func UnsortedEquals(s1, s2 []string) bool {
|
|
if len(s1) != len(s2) {
|
|
return false
|
|
}
|
|
|
|
s1Sorted := make([]string, len(s1))
|
|
s2Sorted := make([]string, len(s2))
|
|
copy(s1Sorted, s1)
|
|
copy(s2Sorted, s2)
|
|
sort.Strings(s1Sorted)
|
|
sort.Strings(s2Sorted)
|
|
|
|
return SortedEquals(s1Sorted, s2Sorted)
|
|
}
|