github.com/lukasheimann/cloudfoundrycli@v7.1.0+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  }