foop
Version:
interfaces that describe their intentions.
75 lines (67 loc) • 5.83 kB
JavaScript
/* istanbul ignore next: WIP */
var ObjectKeys = require('../util/keys')
var isMap = require('../is/map')
var isFalse = require('../is/false')
var reduce = require('../reduce')
var dopemerge = require('./dopemerge')
/**
* merge maps & sets
* @memberOf dopemerge
*
* @param {Map | Set} obj1 merge with 2
* @param {Map | Set} obj2 merge with 1
* @return {Map | Set} merged
*
* @TODO easy clone
*
* @example
*
* var targetMap = new Map()
* targetMap.set('true', false)
* targetMap.set('obj', {obj: []})
* targetMap.set('arr', [1])
* var srcMap = new Map()
* srcMap.set('true', true)
* srcMap.set('obj', {obj: [Symbol]})
* srcMap.set('arr', [2])
* srcMap.set('emptyArr', [])
* var mergedMap = dopemergeMap(targetMap, srcMap, {clone: true})
*
*/
module.exports = function dopemergeMap(obj1, obj2) {
var oneIsMap = isMap(obj1)
var twoIsMap = isMap(obj2)
// eslint-disable-next-line
var eq = function (one, two) { return oneIsMap == one && twoIsMap == two; }
var dest = obj1
var src = obj2
/* prettier-ignore */
// both maps
if (eq(true, true)) {
src = reduce(obj2)
}
// obj1 is map
else if (eq(true, false)) {
src = obj2
}
// obj2 is map
else if (eq(false, true)) {
src = reduce(obj2)
}
// false, false
else {
return dopemerge(obj1, obj2)
}
var keys = ObjectKeys(src)
for (var i = 0; i < keys.length; i++) {
var key = keys[i]
if (isFalse(dest.has(key))) {
dest.set(key, src[key])
}
else {
dest.set(key, dopemerge(dest.get(key), src[key]))
}
}
return dest
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLmpzIiwic291cmNlcyI6WyJtYXAuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IFdJUCAqL1xuXG5jb25zdCBPYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vdXRpbC9rZXlzJylcbmNvbnN0IGlzTWFwID0gcmVxdWlyZSgnLi4vaXMvbWFwJylcbmNvbnN0IGlzRmFsc2UgPSByZXF1aXJlKCcuLi9pcy9mYWxzZScpXG5jb25zdCByZWR1Y2UgPSByZXF1aXJlKCcuLi9yZWR1Y2UnKVxuY29uc3QgZG9wZW1lcmdlID0gcmVxdWlyZSgnLi9kb3BlbWVyZ2UnKVxuXG4vKipcbiAqIG1lcmdlIG1hcHMgJiBzZXRzXG4gKiBAbWVtYmVyT2YgZG9wZW1lcmdlXG4gKlxuICogQHBhcmFtICB7TWFwIHwgU2V0fSBvYmoxIG1lcmdlIHdpdGggMlxuICogQHBhcmFtICB7TWFwIHwgU2V0fSBvYmoyIG1lcmdlIHdpdGggMVxuICogQHJldHVybiB7TWFwIHwgU2V0fSBtZXJnZWRcbiAqXG4gKiBAVE9ETyBlYXN5IGNsb25lXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgIHZhciB0YXJnZXRNYXAgPSBuZXcgTWFwKClcbiAqICAgdGFyZ2V0TWFwLnNldCgndHJ1ZScsIGZhbHNlKVxuICogICB0YXJnZXRNYXAuc2V0KCdvYmonLCB7b2JqOiBbXX0pXG4gKiAgIHRhcmdldE1hcC5zZXQoJ2FycicsIFsxXSlcbiAqICAgdmFyIHNyY01hcCA9IG5ldyBNYXAoKVxuICogICBzcmNNYXAuc2V0KCd0cnVlJywgdHJ1ZSlcbiAqICAgc3JjTWFwLnNldCgnb2JqJywge29iajogW1N5bWJvbF19KVxuICogICBzcmNNYXAuc2V0KCdhcnInLCBbMl0pXG4gKiAgIHNyY01hcC5zZXQoJ2VtcHR5QXJyJywgW10pXG4gKiAgIHZhciBtZXJnZWRNYXAgPSBkb3BlbWVyZ2VNYXAodGFyZ2V0TWFwLCBzcmNNYXAsIHtjbG9uZTogdHJ1ZX0pXG4gKlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRvcGVtZXJnZU1hcChvYmoxLCBvYmoyKSB7XG4gIGNvbnN0IG9uZUlzTWFwID0gaXNNYXAob2JqMSlcbiAgY29uc3QgdHdvSXNNYXAgPSBpc01hcChvYmoyKVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBjb25zdCBlcSA9IChvbmUsIHR3bykgPT4gb25lSXNNYXAgPT0gb25lICYmIHR3b0lzTWFwID09IHR3b1xuXG4gIGxldCBkZXN0ID0gb2JqMVxuICBsZXQgc3JjID0gb2JqMlxuXG4gIC8qIHByZXR0aWVyLWlnbm9yZSAqL1xuICAvLyBib3RoIG1hcHNcbiAgaWYgKGVxKHRydWUsIHRydWUpKSB7XG4gICAgc3JjID0gcmVkdWNlKG9iajIpXG4gIH1cbiAgLy8gb2JqMSBpcyBtYXBcbiAgZWxzZSBpZiAoZXEodHJ1ZSwgZmFsc2UpKSB7XG4gICAgc3JjID0gb2JqMlxuICB9XG4gIC8vIG9iajIgaXMgbWFwXG4gIGVsc2UgaWYgKGVxKGZhbHNlLCB0cnVlKSkge1xuICAgIHNyYyA9IHJlZHVjZShvYmoyKVxuICB9XG4gIC8vIGZhbHNlLCBmYWxzZVxuICBlbHNlIHtcbiAgICByZXR1cm4gZG9wZW1lcmdlKG9iajEsIG9iajIpXG4gIH1cblxuICBjb25zdCBrZXlzID0gT2JqZWN0S2V5cyhzcmMpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IGtleXNbaV1cbiAgICBpZiAoaXNGYWxzZShkZXN0LmhhcyhrZXkpKSkge1xuICAgICAgZGVzdC5zZXQoa2V5LCBzcmNba2V5XSlcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBkZXN0LnNldChrZXksIGRvcGVtZXJnZShkZXN0LmdldChrZXkpLCBzcmNba2V5XSkpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRlc3Rcbn1cbiJdLCJuYW1lcyI6WyJjb25zdCIsImxldCJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUFBLEdBQUssQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztBQUMxQ0EsR0FBSyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDO0FBQ2xDQSxHQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDdENBLEdBQUssQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUNuQ0EsR0FBSyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBCeEMsTUFBTSxDQUFDLE9BQU8sR0FBRyxTQUFTLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO0VBQ2pEQSxHQUFLLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7RUFDNUJBLEdBQUssQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQzs7O0VBRzVCQSxHQUFLLENBQUMsRUFBRSxHQUFHLFNBQUEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEFBQUcsU0FBQSxRQUFRLElBQUksR0FBRyxJQUFJLFFBQVEsSUFBSSxHQUFHLEdBQUE7O0VBRTNEQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUk7RUFDZkEsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJOzs7O0VBSWQsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFO0lBQ2xCLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0dBQ25COztPQUVJLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRTtJQUN4QixHQUFHLEdBQUcsSUFBSTtHQUNYOztPQUVJLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRTtJQUN4QixHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztHQUNuQjs7T0FFSTtJQUNILE9BQU8sU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7R0FDN0I7O0VBRURELEdBQUssQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQztFQUM1QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtJQUNwQ0EsR0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ25CLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtNQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDeEI7U0FDSTtNQUNILElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ2xEO0dBQ0Y7O0VBRUQsT0FBTyxJQUFJO0NBQ1o7In0=