From 33a305b116dec7871bcfeab706ea3f4f86efb423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rgvin=20Ragnarsson?= <201388+nifgraup@users.noreply.github.com> Date: Tue, 20 Oct 2020 22:28:03 +0300 Subject: [PATCH] fix: Clearing empty Set&Map should be noop (#682). Fixes #680 --- __tests__/map-set.js | 14 ++++++++++++++ src/plugins/mapset.ts | 24 ++++++++++++++---------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/__tests__/map-set.js b/__tests__/map-set.js index bbe9d479..cdcc5725 100644 --- a/__tests__/map-set.js +++ b/__tests__/map-set.js @@ -266,5 +266,19 @@ function runBaseTest(name, useProxies, autoFreeze, useListener) { ] ]) }) + + test("#680 - Clearing empty Set&Map should be noop", () => { + const map = new Map() + let result = produce(map, draft => { + draft.clear() + }) + expect(result).toBe(map) + + const set = new Set() + result = produce(set, draft => { + draft.clear() + }) + expect(result).toBe(set) + }) }) } diff --git a/src/plugins/mapset.ts b/src/plugins/mapset.ts index 6dd579a7..0be2ef67 100644 --- a/src/plugins/mapset.ts +++ b/src/plugins/mapset.ts @@ -108,13 +108,15 @@ export function enableMapSet() { p.clear = function() { const state: MapState = this[DRAFT_STATE] assertUnrevoked(state) - prepareMapCopy(state) - markChanged(state) - state.assigned_ = new Map() - each(state.base_, key => { - state.assigned_!.set(key, false) - }) - return state.copy_!.clear() + if (latest(state).size) { + prepareMapCopy(state) + markChanged(state) + state.assigned_ = new Map() + each(state.base_, key => { + state.assigned_!.set(key, false) + }) + state.copy_!.clear() + } } p.forEach = function( @@ -273,9 +275,11 @@ export function enableMapSet() { p.clear = function() { const state: SetState = this[DRAFT_STATE] assertUnrevoked(state) - prepareSetCopy(state) - markChanged(state) - return state.copy_!.clear() + if (latest(state).size) { + prepareSetCopy(state) + markChanged(state) + state.copy_!.clear() + } } p.values = function(): IterableIterator {