aboutsummaryrefslogtreecommitdiff
path: root/src/slices/slices.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/slices/slices.go')
-rw-r--r--src/slices/slices.go36
1 files changed, 22 insertions, 14 deletions
diff --git a/src/slices/slices.go b/src/slices/slices.go
index d96dd8d37c..857ab46314 100644
--- a/src/slices/slices.go
+++ b/src/slices/slices.go
@@ -358,17 +358,21 @@ func Compact[S ~[]E, E comparable](s S) S {
if len(s) < 2 {
return s
}
- i := 1
for k := 1; k < len(s); k++ {
- if s[k] != s[k-1] {
- if i != k {
- s[i] = s[k]
+ if s[k] == s[k-1] {
+ s2 := s[k:]
+ for k2 := 1; k2 < len(s2); k2++ {
+ if s2[k2] != s2[k2-1] {
+ s[k] = s2[k2]
+ k++
+ }
}
- i++
+
+ clear(s[k:]) // zero/nil out the obsolete elements, for GC
+ return s[:k]
}
}
- clear(s[i:]) // zero/nil out the obsolete elements, for GC
- return s[:i]
+ return s
}
// CompactFunc is like [Compact] but uses an equality function to compare elements.
@@ -378,17 +382,21 @@ func CompactFunc[S ~[]E, E any](s S, eq func(E, E) bool) S {
if len(s) < 2 {
return s
}
- i := 1
for k := 1; k < len(s); k++ {
- if !eq(s[k], s[k-1]) {
- if i != k {
- s[i] = s[k]
+ if eq(s[k], s[k-1]) {
+ s2 := s[k:]
+ for k2 := 1; k2 < len(s2); k2++ {
+ if !eq(s2[k2], s2[k2-1]) {
+ s[k] = s2[k2]
+ k++
+ }
}
- i++
+
+ clear(s[k:]) // zero/nil out the obsolete elements, for GC
+ return s[:k]
}
}
- clear(s[i:]) // zero/nil out the obsolete elements, for GC
- return s[:i]
+ return s
}
// Grow increases the slice's capacity, if necessary, to guarantee space for