From a203bfd071d170609c6a5301a4b8edbda56d2d9a Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Sat, 9 Mar 2019 16:34:30 -0500 Subject: [PATCH] express readable in terms of writable --- store.mjs | 35 +++-------------------------------- test/store/index.js | 2 +- 2 files changed, 4 insertions(+), 33 deletions(-) diff --git a/store.mjs b/store.mjs index 67906538c1..faafe31575 100644 --- a/store.mjs +++ b/store.mjs @@ -1,38 +1,8 @@ import { run_all, noop, get_store_value, safe_not_equal } from './internal'; export function readable(start, value) { - const subscribers = []; - let stop; - - 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 { - subscribe(run, invalidate = noop) { - if (subscribers.length === 0) { - stop = start(set); - } - - const subscriber = [run, invalidate]; - subscribers.push(subscriber); - run(value); - - return function() { - const index = subscribers.indexOf(subscriber); - if (index !== -1) subscribers.splice(index, 1); - - if (subscribers.length === 0) { - stop && stop(); - stop = null; - } - }; - } - }; + const { set, subscribe } = writable(value, () => start(set)); + return { subscribe }; } export function writable(value, start = noop) { @@ -42,6 +12,7 @@ export function writable(value, start = noop) { function set(new_value) { if (safe_not_equal(value, new_value)) { value = new_value; + if (!stop) return; // not ready subscribers.forEach(s => s[1]()); subscribers.forEach(s => s[0](value)); } diff --git a/test/store/index.js b/test/store/index.js index 69bcebe843..f993c3a253 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.only('store', () => { +describe('store', () => { describe('writable', () => { it('creates a writable store', () => { const count = writable(0);