1 | 'use strict';
|
2 |
|
3 | Object.defineProperty(exports, '__esModule', { value: true });
|
4 |
|
5 | var internal = require('../internal/index.js');
|
6 |
|
7 | const subscriber_queue = [];
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 | function readable(value, start) {
|
14 | return {
|
15 | subscribe: writable(value, start).subscribe
|
16 | };
|
17 | }
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 | function 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) {
|
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 | }
|
68 | function 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 |
|
110 | Object.defineProperty(exports, 'get', {
|
111 | enumerable: true,
|
112 | get: function () {
|
113 | return internal.get_store_value;
|
114 | }
|
115 | });
|
116 | exports.derived = derived;
|
117 | exports.readable = readable;
|
118 | exports.writable = writable;
|