1 | 'use strict';
|
2 |
|
3 | Object.defineProperty(exports, '__esModule', { value: true });
|
4 |
|
5 | var constants = require('./chunk/constants.js');
|
6 | var utils = require('./chunk/utils.js');
|
7 | var core = require('./core.js');
|
8 |
|
9 | const promiseIgnore = utils.promise(() => {});
|
10 |
|
11 | const CONTINUE = Symbol();
|
12 |
|
13 | function delay(ms) {
|
14 | return utils.promise(resolve => setTimeout(() => resolve(CONTINUE), ms));
|
15 | }
|
16 |
|
17 | function useStateGenerator(stream, initialState, vars = constants.ARRAY_EMPTY) {
|
18 | let [{ ref }, setValue] = core.useState(() => ({
|
19 | ref: createState(initialState)
|
20 | }));
|
21 |
|
22 | core.useEffect(() => ref.cancel, []);
|
23 |
|
24 | ref.stream = stream;
|
25 |
|
26 | return [
|
27 | ref.state,
|
28 | core.useMemo(
|
29 | () =>
|
30 | ref.send(() => {
|
31 | setValue({ ref });
|
32 | }),
|
33 | vars
|
34 | )
|
35 | ];
|
36 | }
|
37 |
|
38 | function consumer(value, process, id, subscribe) {
|
39 | return Promise.resolve(value).then(value => {
|
40 | if (utils.isFunction(value)) {
|
41 | return consumer(value(process.state), process, id, subscribe);
|
42 | }
|
43 |
|
44 | if (typeof value == "object" && utils.isFunction(value.next)) {
|
45 | return utils.promise(resolve => {
|
46 | function scan(generator) {
|
47 | Promise.resolve(
|
48 | generator.next(process.state)
|
49 | ).then(({ value, done }) =>
|
50 | consumer(value, process, id, subscribe).then(() =>
|
51 | done ? resolve(process.state) : scan(generator)
|
52 | )
|
53 | );
|
54 | }
|
55 | scan(value);
|
56 | });
|
57 | }
|
58 | return process.next(value, subscribe, id);
|
59 | });
|
60 | }
|
61 |
|
62 | function createState(state) {
|
63 | let currentID = 0;
|
64 | let process = { state, next, cancel, send };
|
65 |
|
66 | function next(value, subscribe, id) {
|
67 | if (id != currentID) return promiseIgnore;
|
68 | if (value != CONTINUE) {
|
69 | process.state = value;
|
70 | subscribe && subscribe(value);
|
71 | }
|
72 | return process.state;
|
73 | }
|
74 | function cancel() {
|
75 | currentID++;
|
76 | }
|
77 | function send(subscribe) {
|
78 | return consumer(process.stream, process, ++currentID, subscribe);
|
79 | }
|
80 |
|
81 | return process;
|
82 | }
|
83 |
|
84 | exports.CONTINUE = CONTINUE;
|
85 | exports.delay = delay;
|
86 | exports.useStateGenerator = useStateGenerator;
|
87 |
|