diff --git a/vlib/maps/maps.v b/vlib/maps/maps.v index a923fd6ddd2f9b..c2d21390c20a9d 100644 --- a/vlib/maps/maps.v +++ b/vlib/maps/maps.v @@ -68,3 +68,25 @@ pub fn from_array[T](array []T) map[int]T { return mp } + +// merge_by_replace_to adds all the elements of `m2` to the mutable map `m1`. +// If a key exists in both maps, the value from `m1` will be overwritten by the +// value from `m2`. +// Note that this function modifes `m1`, while `m2` will not be. +pub fn merge_by_replace_to[K, V](mut m1 map[K]V, m2 map[K]V) { + for k, v in m2 { + m1[k] = v + } +} + +// merge_by_replace produces a map, that is the result of merging +// the first map m1 with the second map `m2`. If a key exists in both maps, +// the value from m2, will overwrite the value from m1. +// The original maps will not be modified. The return value is a new map. +pub fn merge_by_replace[K, V](m1 map[K]V, m2 map[K]V) map[K]V { + mut res := m1.clone() + for k, v in m2 { + res[k] = v + } + return res +} diff --git a/vlib/maps/maps_test.v b/vlib/maps/maps_test.v index 88a673a5b5015b..7edc873ef2835b 100644 --- a/vlib/maps/maps_test.v +++ b/vlib/maps/maps_test.v @@ -107,3 +107,91 @@ fn test_from_array() { 5: 'f' } } + +fn test_merge_by_replace_to() { + mut m1 := { + 'abc': 'def' + 'aa': 'bb' + } + m2 := { + 'xyz': 'zyx' + 'aa': 'dd' + } + merge_by_replace_to(mut m1, m2) + assert m1 == { + 'abc': 'def' + 'aa': 'dd' + 'xyz': 'zyx' + } + assert m2 == { + 'xyz': 'zyx' + 'aa': 'dd' + } + // + mut im1 := { + 11: 22 + 33: 44 + } + im2 := { + 55: 66 + 33: 999 + } + merge_by_replace_to(mut im1, im2) + assert im1 == { + 11: 22 + 33: 999 + 55: 66 + } + assert im2 == { + 55: 66 + 33: 999 + } +} + +fn test_merge_by_replace() { + m1 := { + 'abc': 'def' + 'aa': 'bb' + } + m2 := { + 'xyz': 'zyx' + 'aa': 'dd' + } + res := merge_by_replace(m1, m2) + assert res == { + 'abc': 'def' + 'aa': 'dd' + 'xyz': 'zyx' + } + assert m1 == { + 'abc': 'def' + 'aa': 'bb' + } + assert m2 == { + 'xyz': 'zyx' + 'aa': 'dd' + } + // + mut im1 := { + 11: 22 + 33: 44 + } + im2 := { + 55: 66 + 33: 999 + } + ires := merge_by_replace(im1, im2) + assert im1 == { + 11: 22 + 33: 44 + } + assert im2 == { + 55: 66 + 33: 999 + } + assert ires == { + 11: 22 + 33: 999 + 55: 66 + } +}