allow stores to work with mutable data - fixes #2171

pull/2190/head
Richard Harris 6 years ago
parent 333b933837
commit 41b14606b4

@ -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) { export function readable(start, value) {
const subscribers = []; const subscribers = [];
let stop; let stop;
function set(newValue) { function set(new_value) {
if (newValue === value) return; if (safe_not_equal(value, new_value)) {
value = newValue; value = new_value;
subscribers.forEach(s => s[1]()); subscribers.forEach(s => s[1]());
subscribers.forEach(s => s[0](value)); subscribers.forEach(s => s[0](value));
}
} }
return { return {
@ -38,11 +39,12 @@ export function writable(value, start = noop) {
let stop; let stop;
const subscribers = []; const subscribers = [];
function set(newValue) { function set(new_value) {
if (newValue === value) return; if (safe_not_equal(value, new_value)) {
value = newValue; value = new_value;
subscribers.forEach(s => s[1]()); subscribers.forEach(s => s[1]());
subscribers.forEach(s => s[0](value)); subscribers.forEach(s => s[0](value));
}
} }
function update(fn) { function update(fn) {

@ -1,7 +1,7 @@
import * as assert from 'assert'; import * as assert from 'assert';
import { readable, writable, derive, get } from '../../store.js'; import { readable, writable, derive, get } from '../../store.js';
describe('store', () => { describe.only('store', () => {
describe('writable', () => { describe('writable', () => {
it('creates a writable store', () => { it('creates a writable store', () => {
const count = writable(0); const count = writable(0);
@ -42,6 +42,23 @@ describe('store', () => {
unsubscribe2(); unsubscribe2();
assert.equal(called, 0); 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', () => { describe('readable', () => {

Loading…
Cancel
Save