From 41b14606b4e2853d9083b4629c7824fce75252f2 Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Sat, 9 Mar 2019 16:22:22 -0500 Subject: [PATCH] allow stores to work with mutable data - fixes #2171 --- store.mjs | 24 +++++++++++++----------- test/store/index.js | 19 ++++++++++++++++++- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/store.mjs b/store.mjs index ba1b89a5c3..67906538c1 100644 --- a/store.mjs +++ b/store.mjs @@ -1,14 +1,15 @@ -import { run_all, noop, get_store_value } from './internal'; +import { run_all, noop, get_store_value, safe_not_equal } from './internal'; export function readable(start, value) { const subscribers = []; let stop; - function set(newValue) { - if (newValue === value) return; - value = newValue; - subscribers.forEach(s => s[1]()); - subscribers.forEach(s => s[0](value)); + function set(new_value) { + if (safe_not_equal(value, new_value)) { + value = new_value; + subscribers.forEach(s => s[1]()); + subscribers.forEach(s => s[0](value)); + } } return { @@ -38,11 +39,12 @@ export function writable(value, start = noop) { let stop; const subscribers = []; - function set(newValue) { - if (newValue === value) return; - value = newValue; - subscribers.forEach(s => s[1]()); - subscribers.forEach(s => s[0](value)); + function set(new_value) { + if (safe_not_equal(value, new_value)) { + value = new_value; + subscribers.forEach(s => s[1]()); + subscribers.forEach(s => s[0](value)); + } } function update(fn) { diff --git a/test/store/index.js b/test/store/index.js index 0bf3ee93e0..69bcebe843 100644 --- a/test/store/index.js +++ b/test/store/index.js @@ -1,7 +1,7 @@ import * as assert from 'assert'; import { readable, writable, derive, get } from '../../store.js'; -describe('store', () => { +describe.only('store', () => { describe('writable', () => { it('creates a writable store', () => { const count = writable(0); @@ -42,6 +42,23 @@ describe('store', () => { unsubscribe2(); assert.equal(called, 0); }); + + it('does not assume immutable data', () => { + const obj = {}; + let called = 0; + + const store = writable(obj); + + store.subscribe(value => { + called += 1; + }); + + store.set(obj); + assert.equal(called, 2); + + store.update(obj => obj); + assert.equal(called, 3); + }); }); describe('readable', () => {