code: function assignKeysAtPaths(obj, newKeys, paths, loopLen) {
    let result = {};
  
    for (let i = 0; i < loopLen; i++) {
      // allows for unequal newKeys/paths lengths
      const iPath = paths[i] ? paths[i] : null;
      const iNewKey = newKeys[i] ? newKeys[i] : paths[i].slice(-1);
  
      const objAtPath = iPath === null ? null : recurPath(obj, iPath);
      const key = objAtPath ? Object.keys(objAtPath)[0] : null;
  
      const curried = curry(Object.assign, result);
  
      // prevent same keys from overriding
      if (newKeys) {
        if (objAtPath) {
          curried({ [iNewKey]: objAtPath[key] });
        } else {
          curried({ [iNewKey]: objAtPath });
        }
      } else if (key in result) {
        curried({ [key + '+' + i]: objAtPath[key] });
      } else {
        curried(objAtPath);
      }
    }
  
    return result;
  }
docs: * Helpers ** /* JSON, [...String], [...[...String]], Number -> Object