crocks
Version:
A collection of well known Algebraic Datatypes for your utter enjoyment.
58 lines (43 loc) • 1.24 kB
JavaScript
/** @license ISC License (c) copyright 2019 original and current authors */
/** @author Ian Hofmann-Hicks */
var curry = require('../core/curry')
var isArray = require('../core/isArray')
var isDefined = require('../core/isDefined')
var isEmpty = require('../core/isEmpty')
var isInteger = require('../core/isInteger')
var isNil = require('../core/isNil')
var isString = require('../core/isString')
var errFn = function (name) { return (name + ": Array of Non-empty Strings or Integers required for second argument"); }
function fn(name) {
function getPathOr(def, keys, target) {
if(!isArray(keys)) {
throw new TypeError(errFn(name))
}
if(isNil(target)) {
return def
}
var value = target
for(var i = 0; i < keys.length; i++) {
var key = keys[i]
if(!(isString(key) && !isEmpty(key) || isInteger(key))) {
throw new TypeError(errFn(name))
}
if(isNil(value)) {
return def
}
value = value[key]
if(!isDefined(value)) {
return def
}
}
return value
}
return curry(getPathOr)
}
// getPathOr :: a -> [ String | Integer ] -> b -> c
var getPathOr =
fn('getPathOr')
getPathOr.origFn =
fn
module.exports =
getPathOr