'use strict'; var forEach = require('./for-each') , isPlainObject = require('./is-plain-object') , value = require('./valid-value') , isArray = Array.isArray , copy, copyItem; copyItem = function (value, key) { var index; if (!isPlainObject(value) && !isArray(value)) return value; index = this[0].indexOf(value); if (index === -1) return copy.call(this, value); return this[1][index]; }; copy = function (source) { var target = isArray(source) ? [] : {}; this[0].push(source); this[1].push(target); if (isArray(source)) { source.forEach(function (value, key) { target[key] = copyItem.call(this, value, key); }, this); } else { forEach(source, function (value, key) { target[key] = copyItem.call(this, value, key); }, this); } return target; }; module.exports = function (source) { var obj = Object(value(source)); if (obj !== source) return obj; return copy.call([[], []], obj); };