cow-value-model.js 692 B

12345678910111213141516171819202122
  1. function copyWith (obj, key, value) {
  2. const result = typeof key === 'number' ? [...obj] : {...obj};
  3. result[key] = value;
  4. return result;
  5. }
  6. export const cowValueModel = (key, keys = key.split('.')) => {
  7. function setField (x = {}, index, val) {
  8. if (index >= keys.length) return val;
  9. const key = keys[index],
  10. value = x[key],
  11. modified = setField(value, index + 1, val);
  12. return value === modified ? x : copyWith(x, key, modified);
  13. }
  14. const GET_SENTINEL = {};
  15. return (obj, val = GET_SENTINEL) =>
  16. val === GET_SENTINEL ?
  17. keys.reduce((x = {}, key) => x[key], obj) :
  18. setField(obj, 0, val);
  19. };