UNPKG

3.53 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', { value: true });
4
5var internal = require('../internal/index.js');
6
7const subscriber_queue = [];
8/**
9 * Creates a `Readable` store that allows reading by subscription.
10 * @param value initial value
11 * @param {StartStopNotifier}start start and stop notifications for subscriptions
12 */
13function readable(value, start) {
14 return {
15 subscribe: writable(value, start).subscribe
16 };
17}
18/**
19 * Create a `Writable` store that allows both updating and reading by subscription.
20 * @param {*=}value initial value
21 * @param {StartStopNotifier=}start start and stop notifications for subscriptions
22 */
23function writable(value, start = internal.noop) {
24 let stop;
25 const subscribers = [];
26 function set(new_value) {
27 if (internal.safe_not_equal(value, new_value)) {
28 value = new_value;
29 if (stop) { // store is ready
30 const run_queue = !subscriber_queue.length;
31 for (let i = 0; i < subscribers.length; i += 1) {
32 const s = subscribers[i];
33 s[1]();
34 subscriber_queue.push(s, value);
35 }
36 if (run_queue) {
37 for (let i = 0; i < subscriber_queue.length; i += 2) {
38 subscriber_queue[i][0](subscriber_queue[i + 1]);
39 }
40 subscriber_queue.length = 0;
41 }
42 }
43 }
44 }
45 function update(fn) {
46 set(fn(value));
47 }
48 function subscribe(run, invalidate = internal.noop) {
49 const subscriber = [run, invalidate];
50 subscribers.push(subscriber);
51 if (subscribers.length === 1) {
52 stop = start(set) || internal.noop;
53 }
54 run(value);
55 return () => {
56 const index = subscribers.indexOf(subscriber);
57 if (index !== -1) {
58 subscribers.splice(index, 1);
59 }
60 if (subscribers.length === 0) {
61 stop();
62 stop = null;
63 }
64 };
65 }
66 return { set, update, subscribe };
67}
68function derived(stores, fn, initial_value) {
69 const single = !Array.isArray(stores);
70 const stores_array = single
71 ? [stores]
72 : stores;
73 const auto = fn.length < 2;
74 return readable(initial_value, (set) => {
75 let inited = false;
76 const values = [];
77 let pending = 0;
78 let cleanup = internal.noop;
79 const sync = () => {
80 if (pending) {
81 return;
82 }
83 cleanup();
84 const result = fn(single ? values[0] : values, set);
85 if (auto) {
86 set(result);
87 }
88 else {
89 cleanup = internal.is_function(result) ? result : internal.noop;
90 }
91 };
92 const unsubscribers = stores_array.map((store, i) => internal.subscribe(store, (value) => {
93 values[i] = value;
94 pending &= ~(1 << i);
95 if (inited) {
96 sync();
97 }
98 }, () => {
99 pending |= (1 << i);
100 }));
101 inited = true;
102 sync();
103 return function stop() {
104 internal.run_all(unsubscribers);
105 cleanup();
106 };
107 });
108}
109
110Object.defineProperty(exports, 'get', {
111 enumerable: true,
112 get: function () {
113 return internal.get_store_value;
114 }
115});
116exports.derived = derived;
117exports.readable = readable;
118exports.writable = writable;