github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/util/generic/merge_reduce.go (about) 1 package generic 2 3 type Reducer func(key, val interface{}, reducedVal Map) Map 4 5 func DeepMerge(maps ...Map) Map { 6 mergedMap := NewMap() 7 return Reduce(maps, mergedMap, mergeReducer) 8 } 9 10 func Merge(collection, otherCollection Map) Map { 11 mergedMap := NewMap() 12 13 iterator := func(key, value interface{}) { 14 mergedMap.Set(key, value) 15 } 16 17 Each(collection, iterator) 18 Each(otherCollection, iterator) 19 20 return mergedMap 21 } 22 23 func Reduce(collections []Map, resultVal Map, cb Reducer) Map { 24 for _, collection := range collections { 25 for _, key := range collection.Keys() { 26 resultVal = cb(key, collection.Get(key), resultVal) 27 } 28 } 29 return resultVal 30 } 31 32 func mergeReducer(key, val interface{}, reduced Map) Map { 33 switch { 34 case reduced.Has(key) == false: 35 reduced.Set(key, val) 36 return reduced 37 38 case IsMappable(val): 39 maps := []Map{NewMap(reduced.Get(key)), NewMap(val)} 40 mergedMap := Reduce(maps, NewMap(), mergeReducer) 41 reduced.Set(key, mergedMap) 42 return reduced 43 44 case IsSliceable(val): 45 reduced.Set(key, append(reduced.Get(key).([]interface{}), val.([]interface{})...)) 46 return reduced 47 48 default: 49 reduced.Set(key, val) 50 return reduced 51 } 52 }