diff --git a/maputil/map.go b/maputil/map.go index 58858a2..951ba11 100644 --- a/maputil/map.go +++ b/maputil/map.go @@ -45,3 +45,15 @@ func ForEach[K comparable, V any](m map[K]V, iteratee func(key K, value V)) { iteratee(k, v) } } + +// Filter iterates over map, return a new map contains all key and value pairs pass the predicate function +func Filter[K comparable, V any](m map[K]V, predicate func(key K, value V) bool) map[K]V { + res := make(map[K]V) + + for k, v := range m { + if predicate(k, v) { + res[k] = v + } + } + return res +} diff --git a/maputil/map_test.go b/maputil/map_test.go index c32e9a5..97a7233 100644 --- a/maputil/map_test.go +++ b/maputil/map_test.go @@ -81,3 +81,25 @@ func TestForEach(t *testing.T) { assert.Equal(10, sum) } + +func TestFilter(t *testing.T) { + assert := internal.NewAssert(t, "TestFilter") + + m := map[string]int{ + "a": 1, + "b": 2, + "c": 3, + "d": 4, + "e": 5, + } + isEven := func(_ string, value int) bool { + return value%2 == 0 + } + + acturl := Filter(m, isEven) + + assert.Equal(map[string]int{ + "b": 2, + "d": 4, + }, acturl) +}