From 22934fd683503ebcf74f9041a0c2f9155f98918a Mon Sep 17 00:00:00 2001 From: Josh Derocher Date: Thu, 13 Dec 2018 13:45:25 -0500 Subject: [PATCH 1/2] added mergeDeep --- src/__tests__/mergeDeep-test.js | 82 +++++++++++++++++++++++++++++++++ src/mergeDeep.js | 36 +++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 src/__tests__/mergeDeep-test.js create mode 100644 src/mergeDeep.js diff --git a/src/__tests__/mergeDeep-test.js b/src/__tests__/mergeDeep-test.js new file mode 100644 index 0000000..09e86c3 --- /dev/null +++ b/src/__tests__/mergeDeep-test.js @@ -0,0 +1,82 @@ +import { Map } from 'immutable'; +import mergeDeep from '../mergeDeep'; + +describe('transmute/mergeDeep', () => { + describe('Object', () => { + it('merges with an Object', () => { + expect( + mergeDeep( + { + one: 3, + three: { + a: 0, + b: 1, + }, + }, + { + one: 1, + two: 2, + three: { + a: 1, + }, + } + ) + ).toMatchSnapshot(); + }); + + it('merges with a Map', () => { + expect( + mergeDeep( + Map({ + one: 3, + three: { + a: 1, + }, + }), + { + one: 1, + two: 2, + three: { + a: 0, + b: 1, + }, + } + ) + ).toMatchSnapshot(); + }); + }); + + describe('Iterable', () => { + const merger = mergeDeep({ one: 3, three: 1 }); + + it('merges with an Object', () => { + expect( + merger( + Map({ + one: 1, + two: 2, + three: { + a: 0, + b: 1, + }, + }) + ) + ).toMatchSnapshot(); + }); + + it('merges with a Map', () => { + expect( + merger( + Map({ + one: 1, + two: 2, + three: { + a: 0, + b: 1, + }, + }) + ) + ).toMatchSnapshot(); + }); + }); +}); diff --git a/src/mergeDeep.js b/src/mergeDeep.js new file mode 100644 index 0000000..ccacf4e --- /dev/null +++ b/src/mergeDeep.js @@ -0,0 +1,36 @@ +import _reduce from './internal/_reduce'; +import _set from './internal/_set'; +import curry from './curry'; +import isObject from './isObject'; +import isRecord from './isRecord'; +import isArray from './isArray'; + +function mergeDeep(updates, subject) { + console.log({ updates, subject }); + return _reduce( + subject, + (acc, value, key) => { + if (isObject(value) || isRecord(value)) { + return _set(key, mergeDeep(value, subject[key]), acc); + } + return _set(key, value, acc); + }, + updates + ); +} + +/** + * Takes each entry of `updates` and sets it on `subject`. + * + * @example + * // returns Map { "one" => 3, "two" => 2, "three" => 1} + * merge( + * Map({one: 1, two: 2, three: 3}), + * Map({one: 3, three: 1}) + * ); + * + * @param {Iterable} updates key-value pairs to merge in `subject`. + * @param {Iterable} subject the thing to update. + * @return {Iterable} with each key-value of `updates` merged into `subject`. + */ +export default curry(mergeDeep); From ef066bf8c7c6e96f017dc6e74ada81b599918e71 Mon Sep 17 00:00:00 2001 From: Josh Derocher Date: Thu, 13 Dec 2018 13:47:55 -0500 Subject: [PATCH 2/2] updated docs --- src/mergeDeep.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mergeDeep.js b/src/mergeDeep.js index ccacf4e..c9f4428 100644 --- a/src/mergeDeep.js +++ b/src/mergeDeep.js @@ -23,10 +23,10 @@ function mergeDeep(updates, subject) { * Takes each entry of `updates` and sets it on `subject`. * * @example - * // returns Map { "one" => 3, "two" => 2, "three" => 1} + * // returns Map { "one" => 3, "two" => 2, "three" => { a: 1, b: 1}} * merge( - * Map({one: 1, two: 2, three: 3}), - * Map({one: 3, three: 1}) + * Map({one: 1, two: 2, three: { a: 1 }}), + * Map({one: 3, three: { a: 0, b: 1}}) * ); * * @param {Iterable} updates key-value pairs to merge in `subject`.