object/path.js

import curry from '../curry'

/**
 * @function path
 * @desc Returns the value of a property identified by a number of nested key values
 * @param {Array} path - Array of key values
 * @param {Object|Array} An object or an array from which to retrieve the keys
 * @example
 *
 * let t = {
 *     a: {
 *         b : [0, 1]
 *     },
 *     b : 1
 * }
 *
 * const v = path(['a', 'b', 0], t)
 * v === 0
 */
export default curry(function path (path, obj) {
  let val = obj
  let idx = 0
  let p
  while (idx < path.length) {
    if (val == null) {
      return
    }
    p = path[idx]
    val = Number.isInteger(p)
      ? p < 0 ? val[val.length + p] : val[p]
      : val[p]
    idx += 1
  }
  return val
})