foop
Version:
interfaces that describe their intentions.
120 lines (102 loc) • 10.3 kB
JavaScript
// nth arg
// toArr
//
// anyKeyVal
//
// // until
// or(where, flip2(where))
//
// dot stuff wrap
// !dottable
// dumping here
// https://github.com/andrewplummer/Sugar/blob/master/lib/number.js#L64
var identity = require('../fp/identity')
var arity = require('../fp/arity')
var mapArray = require('../loop/flipped/mapArrayFlipped')
var argsToArr = require('../cast/argumentsToArray')
var ENV_DEBUG = true
// const at = obj => propOrIndexAkaKey => obj[propOrIndexAkaKey]
// const evolutionAt = at(evolution, identity)
// @TODO need `length` arg for safety
// @curried 2
// could pass in an array that could `evolve` ?
// or object with indexes to prevent `holes` ?
var _coerceArgs = function(fn, evolution) {
// const fnLength = fn.length
return arity(fn.length, function() {
if (ENV_DEBUG) {
console.log('coerce_arguments_before', arguments, '\n')
}
var args = argsToArr.apply(null, arguments)
var evolved = mapArray(args, function (index) {
var arg = args[index]
var evolver = evolution[index]
console.log({arg: arg, index: index, evolver: evolver})
if (evolver) {
return evolver(arg)
}
else {
return arg
}
})
if (ENV_DEBUG) {
console.log('coerce_arguments_after', evolved, '\n')
}
return fn.apply(this, evolved)
})
}
// const nativeToPairs = new Map()
// nativeToPairs
// .set(Function, [isFunction, toFunction])
// .set(Array, [isArray, toArray])
// .set(String, [isString, toString])
// .set(Date, [isDate, toDate])
// .set(Number, [isNumber, toNumber])
// .set(Object, [isObj, toObj])
// .set(Boolean, [isBoolean, toBoolean])
// .set(RegExp, [isRegExp, toRegExp])
// .set(Map, [isMap, toMap])
// .set(Set, [isSet, toSet])
// nativeToPairs.set(null, [isNull, toNumber])
//
// const coerceNative = function(fn, evolutions) {
// return arity(fn.length, function() {})
// }
// const coerceArgs = curry(2, _coerceArgs)
var coerceArgs = _coerceArgs
// toPlainObject
var toLength = require('./toLength')
var toObject = require('./toObj')
var toNumber = require('./toNumber')
var toInteger = require('./toInteger')
var toBoolean = require('./toBoolean')
var toArray = require('./toArray')
var toString = require('./toString')
// https://github.com/the-grid/finitedomain/blob/master/src/trie.js#L78
// https://github.com/the-grid/finitedomain/blob/master/src/domain.js#L1192
// http://jscoercion.qfox.nl/
//
// @TODO coerce returned
// @TODO if obj, check .cast or .toArray etc
// @TODO coerce nested
// @TODO coerceWhen or `coerceFromTo`
function example(
strictArray,
strictString,
strictNumber,
strictBoolean,
stringOrNumber
) {
var hack = strictArray.slice()
hack.push(strictString)
if (strictBoolean) {
hack = hack.concat([strictNumber, stringOrNumber])
}
arguments[arguments.length + 1] = hack
return argsToArr.apply(null, arguments)
}
// http://airbnb.io/projects/hypernova/
// could use the property order and then it is a schema that could be a fn...
var result = coerceArgs(example, [toArray, toString, toNumber, toBoolean])
console.log(result('eh', 10, '100', 0))
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VvcmNlQXJncy5qcyIsInNvdXJjZXMiOlsiY2VvcmNlQXJncy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBudGggYXJnXG4vLyB0b0FyclxuLy9cbi8vIGFueUtleVZhbFxuLy9cbi8vIC8vIHVudGlsXG4vLyBvcih3aGVyZSwgZmxpcDIod2hlcmUpKVxuLy9cbi8vIGRvdCBzdHVmZiB3cmFwXG4vLyAhZG90dGFibGVcblxuLy8gZHVtcGluZyBoZXJlXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYW5kcmV3cGx1bW1lci9TdWdhci9ibG9iL21hc3Rlci9saWIvbnVtYmVyLmpzI0w2NFxuXG5jb25zdCBpZGVudGl0eSA9IHJlcXVpcmUoJy4uL2ZwL2lkZW50aXR5JylcbmNvbnN0IGFyaXR5ID0gcmVxdWlyZSgnLi4vZnAvYXJpdHknKVxuY29uc3QgbWFwQXJyYXkgPSByZXF1aXJlKCcuLi9sb29wL2ZsaXBwZWQvbWFwQXJyYXlGbGlwcGVkJylcbmNvbnN0IGFyZ3NUb0FyciA9IHJlcXVpcmUoJy4uL2Nhc3QvYXJndW1lbnRzVG9BcnJheScpXG5cbmNvbnN0IEVOVl9ERUJVRyA9IHRydWVcbi8vIGNvbnN0IGF0ID0gb2JqID0+IHByb3BPckluZGV4QWthS2V5ID0+IG9ialtwcm9wT3JJbmRleEFrYUtleV1cbi8vIGNvbnN0IGV2b2x1dGlvbkF0ID0gYXQoZXZvbHV0aW9uLCBpZGVudGl0eSlcblxuLy8gQFRPRE8gbmVlZCBgbGVuZ3RoYCBhcmcgZm9yIHNhZmV0eVxuLy8gQGN1cnJpZWQgMlxuLy8gY291bGQgcGFzcyBpbiBhbiBhcnJheSB0aGF0IGNvdWxkIGBldm9sdmVgID9cbi8vIG9yIG9iamVjdCB3aXRoIGluZGV4ZXMgdG8gcHJldmVudCBgaG9sZXNgID9cbmNvbnN0IF9jb2VyY2VBcmdzID0gZnVuY3Rpb24oZm4sIGV2b2x1dGlvbikge1xuICAvLyBjb25zdCBmbkxlbmd0aCA9IGZuLmxlbmd0aFxuICByZXR1cm4gYXJpdHkoZm4ubGVuZ3RoLCBmdW5jdGlvbigpIHtcbiAgICBpZiAoRU5WX0RFQlVHKSB7XG4gICAgICBjb25zb2xlLmxvZygnY29lcmNlX2FyZ3VtZW50c19iZWZvcmUnLCBhcmd1bWVudHMsICdcXG4nKVxuICAgIH1cblxuICAgIGxldCBhcmdzID0gYXJnc1RvQXJyLmFwcGx5KG51bGwsIGFyZ3VtZW50cylcbiAgICBsZXQgZXZvbHZlZCA9IG1hcEFycmF5KGFyZ3MsIGluZGV4ID0+IHtcbiAgICAgIGNvbnN0IGFyZyA9IGFyZ3NbaW5kZXhdXG4gICAgICBjb25zdCBldm9sdmVyID0gZXZvbHV0aW9uW2luZGV4XVxuICAgICAgY29uc29sZS5sb2coe2FyZywgaW5kZXgsIGV2b2x2ZXJ9KVxuXG4gICAgICBpZiAoZXZvbHZlcikge1xuICAgICAgICByZXR1cm4gZXZvbHZlcihhcmcpXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFyZ1xuICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAoRU5WX0RFQlVHKSB7XG4gICAgICBjb25zb2xlLmxvZygnY29lcmNlX2FyZ3VtZW50c19hZnRlcicsIGV2b2x2ZWQsICdcXG4nKVxuICAgIH1cblxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBldm9sdmVkKVxuICB9KVxufVxuXG4vLyBjb25zdCBuYXRpdmVUb1BhaXJzID0gbmV3IE1hcCgpXG4vLyBuYXRpdmVUb1BhaXJzXG4vLyAgIC5zZXQoRnVuY3Rpb24sIFtpc0Z1bmN0aW9uLCB0b0Z1bmN0aW9uXSlcbi8vICAgLnNldChBcnJheSwgW2lzQXJyYXksIHRvQXJyYXldKVxuLy8gICAuc2V0KFN0cmluZywgW2lzU3RyaW5nLCB0b1N0cmluZ10pXG4vLyAgIC5zZXQoRGF0ZSwgW2lzRGF0ZSwgdG9EYXRlXSlcbi8vICAgLnNldChOdW1iZXIsIFtpc051bWJlciwgdG9OdW1iZXJdKVxuLy8gICAuc2V0KE9iamVjdCwgW2lzT2JqLCB0b09ial0pXG4vLyAgIC5zZXQoQm9vbGVhbiwgW2lzQm9vbGVhbiwgdG9Cb29sZWFuXSlcbi8vICAgLnNldChSZWdFeHAsIFtpc1JlZ0V4cCwgdG9SZWdFeHBdKVxuLy8gICAuc2V0KE1hcCwgW2lzTWFwLCB0b01hcF0pXG4vLyAgIC5zZXQoU2V0LCBbaXNTZXQsIHRvU2V0XSlcbi8vIG5hdGl2ZVRvUGFpcnMuc2V0KG51bGwsIFtpc051bGwsIHRvTnVtYmVyXSlcbi8vXG4vLyBjb25zdCBjb2VyY2VOYXRpdmUgPSBmdW5jdGlvbihmbiwgZXZvbHV0aW9ucykge1xuLy8gICByZXR1cm4gYXJpdHkoZm4ubGVuZ3RoLCBmdW5jdGlvbigpIHt9KVxuLy8gfVxuXG4vLyBjb25zdCBjb2VyY2VBcmdzID0gY3VycnkoMiwgX2NvZXJjZUFyZ3MpXG5jb25zdCBjb2VyY2VBcmdzID0gX2NvZXJjZUFyZ3NcblxuLy8gdG9QbGFpbk9iamVjdFxuY29uc3QgdG9MZW5ndGggPSByZXF1aXJlKCcuL3RvTGVuZ3RoJylcbmNvbnN0IHRvT2JqZWN0ID0gcmVxdWlyZSgnLi90b09iaicpXG5jb25zdCB0b051bWJlciA9IHJlcXVpcmUoJy4vdG9OdW1iZXInKVxuY29uc3QgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi90b0ludGVnZXInKVxuY29uc3QgdG9Cb29sZWFuID0gcmVxdWlyZSgnLi90b0Jvb2xlYW4nKVxuY29uc3QgdG9BcnJheSA9IHJlcXVpcmUoJy4vdG9BcnJheScpXG5jb25zdCB0b1N0cmluZyA9IHJlcXVpcmUoJy4vdG9TdHJpbmcnKVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGhlLWdyaWQvZmluaXRlZG9tYWluL2Jsb2IvbWFzdGVyL3NyYy90cmllLmpzI0w3OFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RoZS1ncmlkL2Zpbml0ZWRvbWFpbi9ibG9iL21hc3Rlci9zcmMvZG9tYWluLmpzI0wxMTkyXG4vLyBodHRwOi8vanNjb2VyY2lvbi5xZm94Lm5sL1xuLy9cbi8vIEBUT0RPIGNvZXJjZSByZXR1cm5lZFxuLy8gQFRPRE8gaWYgb2JqLCBjaGVjayAuY2FzdCBvciAudG9BcnJheSBldGNcbi8vIEBUT0RPIGNvZXJjZSBuZXN0ZWRcbi8vIEBUT0RPIGNvZXJjZVdoZW4gb3IgYGNvZXJjZUZyb21Ub2BcbmZ1bmN0aW9uIGV4YW1wbGUoXG4gIHN0cmljdEFycmF5LFxuICBzdHJpY3RTdHJpbmcsXG4gIHN0cmljdE51bWJlcixcbiAgc3RyaWN0Qm9vbGVhbixcbiAgc3RyaW5nT3JOdW1iZXJcbikge1xuICB2YXIgaGFjayA9IHN0cmljdEFycmF5LnNsaWNlKClcbiAgaGFjay5wdXNoKHN0cmljdFN0cmluZylcblxuICBpZiAoc3RyaWN0Qm9vbGVhbikge1xuICAgIGhhY2sgPSBoYWNrLmNvbmNhdChbc3RyaWN0TnVtYmVyLCBzdHJpbmdPck51bWJlcl0pXG4gIH1cblxuICBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCArIDFdID0gaGFja1xuXG4gIHJldHVybiBhcmdzVG9BcnIuYXBwbHkobnVsbCwgYXJndW1lbnRzKVxufVxuXG4vLyBodHRwOi8vYWlyYm5iLmlvL3Byb2plY3RzL2h5cGVybm92YS9cbi8vIGNvdWxkIHVzZSB0aGUgcHJvcGVydHkgb3JkZXIgYW5kIHRoZW4gaXQgaXMgYSBzY2hlbWEgdGhhdCBjb3VsZCBiZSBhIGZuLi4uXG5jb25zdCByZXN1bHQgPSBjb2VyY2VBcmdzKGV4YW1wbGUsIFt0b0FycmF5LCB0b1N0cmluZywgdG9OdW1iZXIsIHRvQm9vbGVhbl0pXG5cbmNvbnNvbGUubG9nKHJlc3VsdCgnZWgnLCAxMCwgJzEwMCcsIDApKVxuIl0sIm5hbWVzIjpbImNvbnN0IiwibGV0Il0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7QUFjQUEsR0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7QUFDMUNBLEdBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztBQUNwQ0EsR0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsaUNBQWlDLENBQUM7QUFDM0RBLEdBQUssQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLDBCQUEwQixDQUFDOztBQUVyREEsR0FBSyxDQUFDLFNBQVMsR0FBRyxJQUFJOzs7Ozs7OztBQVF0QkEsR0FBSyxDQUFDLFdBQVcsR0FBRyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUU7O0VBRTFDLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsV0FBVztJQUNqQyxJQUFJLFNBQVMsRUFBRTtNQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQztLQUN4RDs7SUFFREMsR0FBRyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUM7SUFDM0NBLEdBQUcsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxVQUFBLEtBQUssQ0FBQSxDQUFDLEFBQUc7TUFDcENELEdBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztNQUN2QkEsR0FBSyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO01BQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFBLEdBQUcsRUFBRSxPQUFBLEtBQUssRUFBRSxTQUFBLE9BQU8sQ0FBQyxDQUFDOztNQUVsQyxJQUFJLE9BQU8sRUFBRTtRQUNYLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQztPQUNwQjtXQUNJO1FBQ0gsT0FBTyxHQUFHO09BQ1g7S0FDRixDQUFDOztJQUVGLElBQUksU0FBUyxFQUFFO01BQ2IsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDO0tBQ3JEOztJQUVELE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDO0dBQy9CLENBQUM7Q0FDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJEQSxHQUFLLENBQUMsVUFBVSxHQUFHLFdBQVc7OztBQUc5QkEsR0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO0FBQ3RDQSxHQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7QUFDbkNBLEdBQUssQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUN0Q0EsR0FBSyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO0FBQ3hDQSxHQUFLLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDeENBLEdBQUssQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUNwQ0EsR0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDOzs7Ozs7Ozs7O0FBVXRDLFNBQVMsT0FBTztFQUNkLFdBQVc7RUFDWCxZQUFZO0VBQ1osWUFBWTtFQUNaLGFBQWE7RUFDYixjQUFjO0VBQ2Q7RUFDQSxJQUFJLElBQUksR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFO0VBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDOztFQUV2QixJQUFJLGFBQWEsRUFBRTtJQUNqQixJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztHQUNuRDs7RUFFRCxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJOztFQUV0QyxPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQztDQUN4Qzs7OztBQUlEQSxHQUFLLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQzs7QUFFNUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7In0=