From b7d24dc9bb262281a115059ed0dd6eea845b2d1f Mon Sep 17 00:00:00 2001 From: Louis PORTAY Date: Wed, 7 Dec 2022 10:16:59 +0100 Subject: [PATCH] maps: add Merge function this function allows to merge multiple generic maps in a single one --- maps/maps.go | 13 +++++++++++++ maps/maps_test.go | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/maps/maps.go b/maps/maps.go index ecc0dabb7..bd310f678 100644 --- a/maps/maps.go +++ b/maps/maps.go @@ -92,3 +92,16 @@ func DeleteFunc[M ~map[K]V, K comparable, V any](m M, del func(K, V) bool) { } } } + +// Merge returns every key/value pairs from m maps in a single map. +// The order in which arguments are passed matters, +// the last maps values will override the first ones if some key is identical +func Merge[M ~map[K]V, K comparable, V any](m ...M) M { + r := make(M) + for _, elem := range m { + for k, v := range elem { + r[k] = v + } + } + return r +} diff --git a/maps/maps_test.go b/maps/maps_test.go index bf7c6f4bb..30a644791 100644 --- a/maps/maps_test.go +++ b/maps/maps_test.go @@ -179,3 +179,16 @@ func TestDeleteFunc(t *testing.T) { t.Errorf("DeleteFunc result = %v, want %v", mc, want) } } + +func TestMerge(t *testing.T) { + m1 := map[int]int{1: 2, 2: 4, 4: 8, 8: 16} + m2 := map[int]int{3: 9, 4: 16, 5: 25, 8: 64} + m3 := map[int]int{1: 1, 4: 4, 6: 6, 7: 7} + + want := map[int]int{1: 1, 2: 4, 3: 9, 4: 4, 5: 25, 6: 6, 7: 7, 8: 64} + + res := Merge(m1, m2, m3) + if !Equal(res, want) { + t.Errorf("Merge(%v, %v, %v) = %v, want %v", m1, m2, m3, res, want) + } +}