Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
/* istanbul ignore next: WIP */

import ObjectKeys from '../util/keys'
import {isMap, isFalse} from '../is'
import reduce from '../reduce'
import dopemerge from './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})
 *
 */
export default function dopemergeMap<Value = any>(obj1: Map<string, Value>, obj2: Map<string, Value>) {
  const oneIsMap = isMap(obj1)
  const twoIsMap = isMap(obj2)

  // eslint-disable-next-line
  const eq = (one, two) => oneIsMap == one && twoIsMap == two

  let dest = obj1
  let 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)
  }

  const keys = ObjectKeys(src)

  for (const key of keys) {
    if (isFalse(dest.has(key))) {
      dest.set(key, src[key])
    }
    else {
      dest.set(key, dopemerge(dest.get(key), src[key]))
    }
  }

  return dest
}