UNPKG

2.45 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', { value: true });
4
5var constants = require('./chunk/constants.js');
6var utils = require('./chunk/utils.js');
7var core = require('./core.js');
8
9const promiseIgnore = utils.promise(() => {});
10
11const CONTINUE = Symbol();
12
13function delay(ms) {
14 return utils.promise(resolve => setTimeout(() => resolve(CONTINUE), ms));
15}
16
17function 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
38function 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
62function 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
84exports.CONTINUE = CONTINUE;
85exports.delay = delay;
86exports.useStateGenerator = useStateGenerator;
87//# sourceMappingURL=use-state-generator.js.map