code: function at(target, path, update) {
    path = pathToArray(path);
  
    if (! path.length) {
      return update(target, null);
    }
  
    const key = path[0];
    if (isNumber(key)) {
      if (! Array.isArray(target)) {
        target = [];
      }
    }
    else if (! isObject(target)) {
      target = {};
    }
  
    if (path.length > 1) {
      target[key] = at(target[key], path.slice(1), update);
    }
    else {
      target = update(target, key);
    }
  
    return target;
  }
docs: @callback atCallback
  @param {*} target Target value.
  @param {?(String|Number)} key Key or index of property.
  @return {*} Return new target valus.
   
  at - Update nested `target` at `path` using `update` function.
  
  @param  {*} target Nest object or anything else.
  @param  {Path} path Property path.
  @param  {atCallback} update Update last path's item.
  @return {*} Updated target value