/**
 * Created by clay on 2019/10/14
 * Description: common utils
 */

/**
 * This is just a simple version of deep copy
 * Has a lot of edge cases bug
 * If you want to use a perfect deep copy, use lodash's _.cloneDeep
 * @param {Object} source
 * @returns {Object} targetObj
 */
export function deepClone(source) {
  if (!source && typeof source !== 'object') {
    throw new Error('error arguments: deepClone')
  }
  let targetObj = source.constructor === Array ? [] : {}
  Object.keys(source).forEach(key => {
    if (source[key] && typeof source[key] === 'object') {
      targetObj[key] = deepClone(source[key])
    } else {
      targetObj[key] = source[key]
    }
  })
  return targetObj
}

/**
 * Randomly extract one or more elements from an array
 * If you want to use a perfect solution, use lodash's _.sample or _.sampleSize
 * @param {Array} arr
 * @param {number} count
 * @returns {Array} arr
 */
export function getRandomArrayElements(arr, count = 1) {
  if (count > arr.length) {
    throw new Error('error arguments: count is greater than length of array')
  }
  let shuffled = arr.slice(0), i = arr.length, min = i - count, temp, index
  while (i-- > min) {
    index = Math.floor((i + 1) * Math.random())
    temp = shuffled[index]
    shuffled[index] = shuffled[i]
    shuffled[i] = temp
  }
  return shuffled.slice(min)
}
