From 8360da72cb9e5120a45acbe483764ce5a18e4449 Mon Sep 17 00:00:00 2001 From: cha0s Date: Fri, 17 May 2019 04:31:37 -0500 Subject: [PATCH] feat: merge and mergeDiff --- packages/core/index.js | 7 ++++++ packages/core/merge-diff.js | 49 +++++++++++++++++++++++++++++++++++++ packages/core/merge.js | 10 ++++++++ packages/core/package.json | 7 ++++-- 4 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 packages/core/merge-diff.js create mode 100644 packages/core/merge.js diff --git a/packages/core/index.js b/packages/core/index.js index 1ee1481..924ee4e 100644 --- a/packages/core/index.js +++ b/packages/core/index.js @@ -69,5 +69,12 @@ export class TickingPromise extends Promise { } export {EventEmitterMixin as EventEmitter} from './event-emitter'; +export {merge} from './merge'; +export { + mergeDiff, + mergeDiffArray, + mergeDiffObject, + mergeDiffPrimitive, +} from './merge-diff'; export {fastApply} from './fast-apply'; export {PropertyMixin as Property} from './property'; diff --git a/packages/core/merge-diff.js b/packages/core/merge-diff.js new file mode 100644 index 0000000..9b4f2a8 --- /dev/null +++ b/packages/core/merge-diff.js @@ -0,0 +1,49 @@ + +export function mergeDiffArray(pristine, current) { + if (!Array.isArray(pristine)) { + return current; + } + if (pristine.length !== current.length) { + return current; + } + for (let i = 0; i < pristine.length; i++) { + if (JSON.stringify(current[i]) !== JSON.stringify(pristine[i])) { + return current; + } + } +} + +export function mergeDiffObject(pristine, current) { + if ('object' !== typeof pristine) { + return current; + } + const diff = {}; + for (const i in current) { + const value = mergeDiff(pristine[i], current[i]); + if (undefined !== value) { + diff[i] = value; + } + } + if (0 === Object.keys(diff).length) { + return undefined; + } + return diff; +} + +export function mergeDiffPrimitive(pristine, current) { + if (pristine !== current) { + return current; + } +} + +export function mergeDiff(pristine, current) { + if (Array.isArray(current)) { + return mergeDiffArray(pristine, current); + } + else if ('object' === typeof current) { + return mergeDiffObject(pristine, current); + } + else { + return mergeDiffPrimitive(pristine, current); + } +} diff --git a/packages/core/merge.js b/packages/core/merge.js new file mode 100644 index 0000000..528aee5 --- /dev/null +++ b/packages/core/merge.js @@ -0,0 +1,10 @@ +import mergeWith from 'lodash.mergewith'; + +export function merge(...args) { + args.push((l, r) => { + if (Array.isArray(l)) { + return r; + } + }); + return mergeWith.apply(null, args); +} diff --git a/packages/core/package.json b/packages/core/package.json index 98d4509..0996b2a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,7 +1,10 @@ { "name": "@avocado/core", - "version": "1.0.5", + "version": "1.0.6", "main": "index.js", "author": "cha0s", - "license": "MIT" + "license": "MIT", + "dependencies": { + "lodash.mergewith": "4.6.1" + } }