2023-04-06 12:07:57 +01:00
|
|
|
package deepcopy
|
2022-10-02 05:45:27 +00:00
|
|
|
|
2023-04-06 12:07:57 +01:00
|
|
|
type Copier[T any] interface {
|
2023-03-25 19:13:06 +00:00
|
|
|
DeepCopy() T
|
|
|
|
}
|
2022-10-02 05:45:27 +00:00
|
|
|
|
2023-04-06 12:07:57 +01:00
|
|
|
func Slice[T any](orig []T) []T {
|
2022-10-02 05:45:27 +00:00
|
|
|
if orig == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
c := make([]T, len(orig))
|
2023-03-25 19:13:06 +00:00
|
|
|
for i, v := range orig {
|
2023-04-06 12:07:57 +01:00
|
|
|
if copyable, ok := any(v).(Copier[T]); ok {
|
2023-03-25 19:13:06 +00:00
|
|
|
c[i] = copyable.DeepCopy()
|
|
|
|
} else {
|
|
|
|
c[i] = v
|
|
|
|
}
|
|
|
|
}
|
2022-10-02 05:45:27 +00:00
|
|
|
return c
|
|
|
|
}
|
|
|
|
|
2023-04-06 12:07:57 +01:00
|
|
|
func Map[K comparable, V any](orig map[K]V) map[K]V {
|
2022-10-02 05:45:27 +00:00
|
|
|
if orig == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
c := make(map[K]V, len(orig))
|
|
|
|
for k, v := range orig {
|
2023-04-06 12:07:57 +01:00
|
|
|
if copyable, ok := any(v).(Copier[V]); ok {
|
2023-03-25 19:13:06 +00:00
|
|
|
c[k] = copyable.DeepCopy()
|
|
|
|
} else {
|
|
|
|
c[k] = v
|
|
|
|
}
|
2022-10-02 05:45:27 +00:00
|
|
|
}
|
|
|
|
return c
|
|
|
|
}
|