code: func (c *Scratch) Add(key string, newAddend interface{}) (string, error) {
  
  	var newVal interface{}
  	c.mu.RLock()
  	existingAddend, found := c.values[key]
  	c.mu.RUnlock()
  	if found {
  		var err error
  
  		addendV := reflect.TypeOf(existingAddend)
  
  		if addendV.Kind() == reflect.Slice || addendV.Kind() == reflect.Array {
  			newVal, err = collections.Append(existingAddend, newAddend)
  			if err != nil {
  				return "", err
  			}
  		} else {
  			newVal, err = math.DoArithmetic(existingAddend, newAddend, '+')
  			if err != nil {
  				return "", err
  			}
  		}
  	} else {
  		newVal = newAddend
  	}
  	c.mu.Lock()
  	c.values[key] = newVal
  	c.mu.Unlock()
  	return "", nil // have to return something to make it work with the Go templates
  }
docs: // Add will, for single values, add (using the + operator) the addend to the existing addend (if found).
  // Supports numeric values and strings.
  //
  // If the first add for a key is an array or slice, then the next value(s) will be appended.