code: function setIn (source, key, value) {
      if (isNil(source)) {
          throw _makeTypeErrorFor(source, "object");
      }
  
      return _setIn(source, key, value);
  }
docs: Sets the specified key to the given value in a copy of the provided object.<br/>
  All the remaining enumerable keys of the source object will be simply copied in the
  result object without breaking references.<br/>
  If the specified key is not part of the source object, it will be added to the
  result.<br/>
  The main purpose of the function is to work on simple plain objects used as
  data structures, such as JSON objects, and makes no effort to play nice with
  objects created from an OOP perspective (it's not worth it).<br/>
  For example the prototype of the result will be <code>Object</code>'s regardless
  of the <code>source</code>'s one.
  @example
  var user = {name: "John", surname: "Doe", age: 30};
  
  _.setIn(user, "name", "Jane") // => {name: "Jane", surname: "Doe", age: 30}
  _.setIn(user, "gender", "male") // => {name: "John", surname: "Doe", age: 30, gender: "male"}
  
  // `user` still is {name: "John", surname: "Doe", age: 30}
  
  @memberof module:lamb
  @category Object
  @see {@link module:lamb.setKey|setKey}
  @see {@link module:lamb.setPath|setPath}, {@link module:lamb.setPathIn|setPathIn}
  @since 0.18.0
  @param {Object} source
  @param {String} key
  @param {*} value
  @returns {Object}