express readable in terms of writable

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

@ -1,38 +1,8 @@
import { run_all, noop, get_store_value, safe_not_equal } 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 { set, subscribe } = writable(value, () => start(set));
let stop; return { subscribe };
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;
}
};
}
};
} }
export function writable(value, start = noop) { export function writable(value, start = noop) {
@ -42,6 +12,7 @@ export function writable(value, start = noop) {
function set(new_value) { function set(new_value) {
if (safe_not_equal(value, new_value)) { if (safe_not_equal(value, new_value)) {
value = new_value; value = new_value;
if (!stop) return; // not ready
subscribers.forEach(s => s[1]()); subscribers.forEach(s => s[1]());
subscribers.forEach(s => s[0](value)); subscribers.forEach(s => s[0](value));
} }

@ -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.only('store', () => { describe('store', () => {
describe('writable', () => { describe('writable', () => {
it('creates a writable store', () => { it('creates a writable store', () => {
const count = writable(0); const count = writable(0);

Loading…
Cancel
Save