foop
Version:
interfaces that describe their intentions.
94 lines (87 loc) • 6.54 kB
JavaScript
var isFunction = require('../is/function')
var isObj = require('../is/obj')
var hasIn = require('../is/in')
var ignored = require('../meta/ignored')
var ObjectKeys = require('../util/keys')
var ObjectAssign = require('../util/assign')
/**
* @desc recursively reduce maps and objects that include reducable data
* @since 4.0.0
*
* @sig reduced => object => isMap(object) -> reduced; merge(object, reduced)
*
* @param {Object | any} reduced merged object and reduced
* @return {Function} Function(values: Object)
*
* @see https://www.airpair.com/javascript/javascript-array-reduce
* @see ChainedMap
* @NOTE could curry, but this is super hot function
*
* @example
*
* const map = new Map()
* map.set('eh', true)
* const nested = new Map()
* nested.set('reduced', true)
*
* const chain = {
* entries() {
* return {
* nested: reduce(nested),
* key: true,
* }
* },
* }
* const reduced = reduce(map)
* reduceEntries(reduced)({chain})
* //=> {
* eh: true,
* chain: {
* nested: {
* reduced: true,
* key: true,
* },
* },
* }
*
* @example
*
* const reducedIgnored = {
* canada: {
* store: chain,
* },
* }
* const ignored = reduceEntries(reduced)(reducedIgnored)
* //=> {
* eh: true,
* chain: {
* nested: {
* reduced: true,
* },
* key: true,
* },
* }
*
*/
module.exports = function (reduced) { return function (obj) {
var keys = ObjectKeys(obj)
// const filter = (value, key) =>
// !ignored(key) && hasIn(value, 'entries')
// const transform = (value, key) =>
// ObjectAssign(reduced, {[key]: value.entries(true) || {}})
// mapFilterWhere(obj, filter, transform)
for (var k = 0; k < keys.length; k++) {
var key = keys[k]
if (ignored(key)) {
continue
}
var value = obj[key]
// @NOTE could use hasInMatching here
// isObj(value) && isFunction(value.entries)
if (hasIn(value, 'entries')) {
ObjectAssign(reduced, {[key]: value.entries(true) || {}})
}
}
return reduced
}; }
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50cmllcy5qcyIsInNvdXJjZXMiOlsiZW50cmllcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi4vaXMvZnVuY3Rpb24nKVxuY29uc3QgaXNPYmogPSByZXF1aXJlKCcuLi9pcy9vYmonKVxuY29uc3QgaGFzSW4gPSByZXF1aXJlKCcuLi9pcy9pbicpXG5jb25zdCBpZ25vcmVkID0gcmVxdWlyZSgnLi4vbWV0YS9pZ25vcmVkJylcbmNvbnN0IE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi91dGlsL2tleXMnKVxuY29uc3QgT2JqZWN0QXNzaWduID0gcmVxdWlyZSgnLi4vdXRpbC9hc3NpZ24nKVxuXG4vKipcbiAqIEBkZXNjIHJlY3Vyc2l2ZWx5IHJlZHVjZSBtYXBzIGFuZCBvYmplY3RzIHRoYXQgaW5jbHVkZSByZWR1Y2FibGUgZGF0YVxuICogQHNpbmNlIDQuMC4wXG4gKlxuICogQHNpZyByZWR1Y2VkID0+IG9iamVjdCA9PiBpc01hcChvYmplY3QpIC0+IHJlZHVjZWQ7IG1lcmdlKG9iamVjdCwgcmVkdWNlZClcbiAqXG4gKiBAcGFyYW0ge09iamVjdCB8IGFueX0gcmVkdWNlZCBtZXJnZWQgb2JqZWN0IGFuZCByZWR1Y2VkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gRnVuY3Rpb24odmFsdWVzOiBPYmplY3QpXG4gKlxuICogQHNlZSBodHRwczovL3d3dy5haXJwYWlyLmNvbS9qYXZhc2NyaXB0L2phdmFzY3JpcHQtYXJyYXktcmVkdWNlXG4gKiBAc2VlIENoYWluZWRNYXBcbiAqIEBOT1RFIGNvdWxkIGN1cnJ5LCBidXQgdGhpcyBpcyBzdXBlciBob3QgZnVuY3Rpb25cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgY29uc3QgbWFwID0gbmV3IE1hcCgpXG4gKiAgIG1hcC5zZXQoJ2VoJywgdHJ1ZSlcbiAqICAgY29uc3QgbmVzdGVkID0gbmV3IE1hcCgpXG4gKiAgIG5lc3RlZC5zZXQoJ3JlZHVjZWQnLCB0cnVlKVxuICpcbiAqICAgY29uc3QgY2hhaW4gPSB7XG4gKiAgICAgZW50cmllcygpIHtcbiAqICAgICAgIHJldHVybiB7XG4gKiAgICAgICAgIG5lc3RlZDogcmVkdWNlKG5lc3RlZCksXG4gKiAgICAgICAgIGtleTogdHJ1ZSxcbiAqICAgICAgIH1cbiAqICAgICB9LFxuICogICB9XG4gKiAgIGNvbnN0IHJlZHVjZWQgPSByZWR1Y2UobWFwKVxuICogICByZWR1Y2VFbnRyaWVzKHJlZHVjZWQpKHtjaGFpbn0pXG4gKiAgIC8vPT4ge1xuICogICAgIGVoOiB0cnVlLFxuICogICAgIGNoYWluOiB7XG4gKiAgICAgICBuZXN0ZWQ6IHtcbiAqICAgICAgICAgcmVkdWNlZDogdHJ1ZSxcbiAqICAgICAgICAga2V5OiB0cnVlLFxuICogICAgICAgfSxcbiAqICAgICB9LFxuICogICB9XG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgIGNvbnN0IHJlZHVjZWRJZ25vcmVkID0ge1xuICogICAgIGNhbmFkYToge1xuICogICAgICAgc3RvcmU6IGNoYWluLFxuICogICAgIH0sXG4gKiAgIH1cbiAqICAgY29uc3QgaWdub3JlZCA9IHJlZHVjZUVudHJpZXMocmVkdWNlZCkocmVkdWNlZElnbm9yZWQpXG4gKiAgIC8vPT4ge1xuICogICAgIGVoOiB0cnVlLFxuICogICAgIGNoYWluOiB7XG4gKiAgICAgICBuZXN0ZWQ6IHtcbiAqICAgICAgICAgcmVkdWNlZDogdHJ1ZSxcbiAqICAgICAgIH0sXG4gKiAgICAgICBrZXk6IHRydWUsXG4gKiAgICAgfSxcbiAqICAgfVxuICpcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSByZWR1Y2VkID0+IG9iaiA9PiB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3RLZXlzKG9iailcblxuICAvLyBjb25zdCBmaWx0ZXIgPSAodmFsdWUsIGtleSkgPT5cbiAgLy8gICAhaWdub3JlZChrZXkpICYmIGhhc0luKHZhbHVlLCAnZW50cmllcycpXG4gIC8vIGNvbnN0IHRyYW5zZm9ybSA9ICh2YWx1ZSwga2V5KSA9PlxuICAvLyAgIE9iamVjdEFzc2lnbihyZWR1Y2VkLCB7W2tleV06IHZhbHVlLmVudHJpZXModHJ1ZSkgfHwge319KVxuICAvLyBtYXBGaWx0ZXJXaGVyZShvYmosIGZpbHRlciwgdHJhbnNmb3JtKVxuXG4gIGZvciAobGV0IGsgPSAwOyBrIDwga2V5cy5sZW5ndGg7IGsrKykge1xuICAgIGNvbnN0IGtleSA9IGtleXNba11cblxuICAgIGlmIChpZ25vcmVkKGtleSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XVxuICAgIC8vIEBOT1RFIGNvdWxkIHVzZSBoYXNJbk1hdGNoaW5nIGhlcmVcbiAgICAvLyBpc09iaih2YWx1ZSkgJiYgaXNGdW5jdGlvbih2YWx1ZS5lbnRyaWVzKVxuICAgIGlmIChoYXNJbih2YWx1ZSwgJ2VudHJpZXMnKSkge1xuICAgICAgT2JqZWN0QXNzaWduKHJlZHVjZWQsIHtba2V5XTogdmFsdWUuZW50cmllcyh0cnVlKSB8fCB7fX0pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlZHVjZWRcbn1cbiJdLCJuYW1lcyI6WyJjb25zdCIsImxldCJdLCJtYXBwaW5ncyI6IkFBQUFBLEdBQUssQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDO0FBQzVDQSxHQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7QUFDbENBLEdBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUNqQ0EsR0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUM7QUFDMUNBLEdBQUssQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztBQUMxQ0EsR0FBSyxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE2RDlDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBQSxPQUFPLENBQUEsQ0FBQyxBQUFHLFNBQUEsVUFBQSxHQUFHLENBQUEsQ0FBQyxBQUFHO0VBQ2pDQSxHQUFLLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUM7Ozs7Ozs7O0VBUTVCLEtBQUtDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQ3BDRCxHQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7O0lBRW5CLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO01BQ2hCLFFBQVE7S0FDVDs7SUFFREEsR0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDOzs7SUFHdEIsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFO01BQzNCLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0tBQzFEO0dBQ0Y7O0VBRUQsT0FBTyxPQUFPO0NBQ2YsR0FBQTsifQ==