fix: deep copying pointers inside slices (#1072)

This commit is contained in:
Pete Davison
2023-03-25 19:13:06 +00:00
committed by GitHub
parent d72eb009e4
commit cc1fd3d03e
7 changed files with 105 additions and 35 deletions

View File

@@ -1,23 +1,35 @@
package taskfile
import "golang.org/x/exp/constraints"
type DeepCopier[T any] interface {
DeepCopy() T
}
func deepCopySlice[T any](orig []T) []T {
if orig == nil {
return nil
}
c := make([]T, len(orig))
copy(c, orig)
for i, v := range orig {
if copyable, ok := any(v).(DeepCopier[T]); ok {
c[i] = copyable.DeepCopy()
} else {
c[i] = v
}
}
return c
}
func deepCopyMap[K constraints.Ordered, V any](orig map[K]V) map[K]V {
func deepCopyMap[K comparable, V any](orig map[K]V) map[K]V {
if orig == nil {
return nil
}
c := make(map[K]V, len(orig))
for k, v := range orig {
c[k] = v
if copyable, ok := any(v).(DeepCopier[V]); ok {
c[k] = copyable.DeepCopy()
} else {
c[k] = v
}
}
return c
}