const cloneArray = array => array.map(deepClone)

const cloneObject = object =>
  Object.keys(object)
    .reduce((clone, key) => ({ ...clone, [key]: deepClone(object[key])}), {})

export const deepClone = value =>
  Array.isArray(value)
    ? cloneArray(value)
    : value !== null && typeof value === 'object'
      ? cloneObject(value)
      : value