import curry from './util/curry' import update from './update' import map from './map' import splitPath from './util/splitPath' const wildcard = '*' function reducePath(acc, key) { if (key === wildcard) { return value => (Object.prototype.hasOwnProperty.call(value, wildcard) ? // If we actually have wildcard as a property, update that update({ [wildcard]: acc }, value) : // Otherwise map over all properties map(acc, value)) } return { [key]: acc } } function updateIn(path, value, object) { const parts = splitPath(path) const updates = parts.reduceRight(reducePath, value) return update(updates, object) } export default curry(updateIn)