| | var Stack = require('./_Stack'), |
| | arrayEach = require('./_arrayEach'), |
| | assignValue = require('./_assignValue'), |
| | baseAssign = require('./_baseAssign'), |
| | baseAssignIn = require('./_baseAssignIn'), |
| | cloneBuffer = require('./_cloneBuffer'), |
| | copyArray = require('./_copyArray'), |
| | copySymbols = require('./_copySymbols'), |
| | copySymbolsIn = require('./_copySymbolsIn'), |
| | getAllKeys = require('./_getAllKeys'), |
| | getAllKeysIn = require('./_getAllKeysIn'), |
| | getTag = require('./_getTag'), |
| | initCloneArray = require('./_initCloneArray'), |
| | initCloneByTag = require('./_initCloneByTag'), |
| | initCloneObject = require('./_initCloneObject'), |
| | isArray = require('./isArray'), |
| | isBuffer = require('./isBuffer'), |
| | isMap = require('./isMap'), |
| | isObject = require('./isObject'), |
| | isSet = require('./isSet'), |
| | keys = require('./keys'); |
| |
|
| | |
| | var CLONE_DEEP_FLAG = 1, |
| | CLONE_FLAT_FLAG = 2, |
| | CLONE_SYMBOLS_FLAG = 4; |
| |
|
| | |
| | var argsTag = '[object Arguments]', |
| | arrayTag = '[object Array]', |
| | boolTag = '[object Boolean]', |
| | dateTag = '[object Date]', |
| | errorTag = '[object Error]', |
| | funcTag = '[object Function]', |
| | genTag = '[object GeneratorFunction]', |
| | mapTag = '[object Map]', |
| | numberTag = '[object Number]', |
| | objectTag = '[object Object]', |
| | regexpTag = '[object RegExp]', |
| | setTag = '[object Set]', |
| | stringTag = '[object String]', |
| | symbolTag = '[object Symbol]', |
| | weakMapTag = '[object WeakMap]'; |
| |
|
| | var arrayBufferTag = '[object ArrayBuffer]', |
| | dataViewTag = '[object DataView]', |
| | float32Tag = '[object Float32Array]', |
| | float64Tag = '[object Float64Array]', |
| | int8Tag = '[object Int8Array]', |
| | int16Tag = '[object Int16Array]', |
| | int32Tag = '[object Int32Array]', |
| | uint8Tag = '[object Uint8Array]', |
| | uint8ClampedTag = '[object Uint8ClampedArray]', |
| | uint16Tag = '[object Uint16Array]', |
| | uint32Tag = '[object Uint32Array]'; |
| |
|
| | |
| | var cloneableTags = {}; |
| | cloneableTags[argsTag] = cloneableTags[arrayTag] = |
| | cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = |
| | cloneableTags[boolTag] = cloneableTags[dateTag] = |
| | cloneableTags[float32Tag] = cloneableTags[float64Tag] = |
| | cloneableTags[int8Tag] = cloneableTags[int16Tag] = |
| | cloneableTags[int32Tag] = cloneableTags[mapTag] = |
| | cloneableTags[numberTag] = cloneableTags[objectTag] = |
| | cloneableTags[regexpTag] = cloneableTags[setTag] = |
| | cloneableTags[stringTag] = cloneableTags[symbolTag] = |
| | cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = |
| | cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; |
| | cloneableTags[errorTag] = cloneableTags[funcTag] = |
| | cloneableTags[weakMapTag] = false; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | function baseClone(value, bitmask, customizer, key, object, stack) { |
| | var result, |
| | isDeep = bitmask & CLONE_DEEP_FLAG, |
| | isFlat = bitmask & CLONE_FLAT_FLAG, |
| | isFull = bitmask & CLONE_SYMBOLS_FLAG; |
| |
|
| | if (customizer) { |
| | result = object ? customizer(value, key, object, stack) : customizer(value); |
| | } |
| | if (result !== undefined) { |
| | return result; |
| | } |
| | if (!isObject(value)) { |
| | return value; |
| | } |
| | var isArr = isArray(value); |
| | if (isArr) { |
| | result = initCloneArray(value); |
| | if (!isDeep) { |
| | return copyArray(value, result); |
| | } |
| | } else { |
| | var tag = getTag(value), |
| | isFunc = tag == funcTag || tag == genTag; |
| |
|
| | if (isBuffer(value)) { |
| | return cloneBuffer(value, isDeep); |
| | } |
| | if (tag == objectTag || tag == argsTag || (isFunc && !object)) { |
| | result = (isFlat || isFunc) ? {} : initCloneObject(value); |
| | if (!isDeep) { |
| | return isFlat |
| | ? copySymbolsIn(value, baseAssignIn(result, value)) |
| | : copySymbols(value, baseAssign(result, value)); |
| | } |
| | } else { |
| | if (!cloneableTags[tag]) { |
| | return object ? value : {}; |
| | } |
| | result = initCloneByTag(value, tag, isDeep); |
| | } |
| | } |
| | |
| | stack || (stack = new Stack); |
| | var stacked = stack.get(value); |
| | if (stacked) { |
| | return stacked; |
| | } |
| | stack.set(value, result); |
| |
|
| | if (isSet(value)) { |
| | value.forEach(function(subValue) { |
| | result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); |
| | }); |
| |
|
| | return result; |
| | } |
| |
|
| | if (isMap(value)) { |
| | value.forEach(function(subValue, key) { |
| | result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack)); |
| | }); |
| |
|
| | return result; |
| | } |
| |
|
| | var keysFunc = isFull |
| | ? (isFlat ? getAllKeysIn : getAllKeys) |
| | : (isFlat ? keysIn : keys); |
| |
|
| | var props = isArr ? undefined : keysFunc(value); |
| | arrayEach(props || value, function(subValue, key) { |
| | if (props) { |
| | key = subValue; |
| | subValue = value[key]; |
| | } |
| | |
| | assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); |
| | }); |
| | return result; |
| | } |
| |
|
| | module.exports = baseClone; |
| |
|