code: function updateIn (source, key, updater) {
      return _isEnumerable(source, key) ?
          _setIn(source, key, updater(source[key])) :
          _merge(enumerables, source, {});
  }
docs: Creates a copy of the given object having the desired key value updated by applying
  the provided function to it.<br/>
  This function is meant for updating existing enumerable properties, and for those it
  will delegate the "set action" to {@link module:lamb.setIn|setIn}; a copy of the
  <code>source</code> is returned otherwise.
  @example
  var user = {name: "John", visits: 2};
  var toUpperCase = _.invoker("toUpperCase");
  
  _.updateIn(user, "name", toUpperCase) // => {name: "JOHN", visits: 2}
  _.updateIn(user, "surname", toUpperCase) // => {name: "John", visits: 2}
  
  @example <caption>Non-enumerable properties will be treated as non-existent:</caption>
  var user = Object.create({name: "John"}, {visits: {value: 2}});
  
  _.updateIn(user, "visits", _.add(1)) // => {name: "John", visits: 2}
  
  @memberof module:lamb
  @category Object
  @see {@link module:lamb.updateKey|updateKey}
  @see {@link module:lamb.updatePath|updatePath}, {@link module:lamb.updatePathIn|updatePathIn}
  @since 0.22.0
  @param {Object} source
  @param {String} key
  @param {Function} updater
  @returns {Object}