code: func (v mergeStrategy) doMergeMap(e map[string]apply.Element) (apply.Result, error) {
  
  	// Merge each item in the list
  	merged := map[string]interface{}{}
  	for key, value := range e {
  		// Recursively merge the map element before adding the value to the map
  		result, err := value.Merge(v.strategic)
  		if err != nil {
  			return apply.Result{}, err
  		}
  
  		switch result.Operation {
  		case apply.SET:
  			// Keep the map item value
  			merged[key] = result.MergedResult
  		case apply.DROP:
  			// Drop the map item value
  		default:
  			panic(fmt.Errorf("Unexpected result operation type %+v", result))
  		}
  	}
  
  	// Return the merged map, and tell the caller to keep it
  	if len(merged) == 0 {
  		// Special case the empty map to set the field value to nil, but keep the field key
  		// This is how the tests expect the structures to look when parsed from yaml
  		return apply.Result{Operation: apply.SET, MergedResult: nil}, nil
  	}
  	return apply.Result{Operation: apply.SET, MergedResult: merged}, nil
  }
docs: // do merges a recorded, local and remote map into a new object