UNPKG

4.62 kBSource Map (JSON)View Raw
1{"version":3,"file":"use-state-generator.js","sources":["src/use-state-generator/use-state-generator.js"],"sourcesContent":["import { useState, useMemo, useEffect } from \"../core/core\";\r\nimport { isFunction, promise } from \"../core/utils\";\r\nimport { ARRAY_EMPTY } from \"../core/constants\";\r\n\r\nconst promiseIgnore = promise(() => {});\r\n\r\nexport const CONTINUE = Symbol();\r\n\r\nexport function delay(ms) {\r\n return promise(resolve => setTimeout(() => resolve(CONTINUE), ms));\r\n}\r\n\r\nexport function useStateGenerator(stream, initialState, vars = ARRAY_EMPTY) {\r\n let [{ ref }, setValue] = useState(() => ({\r\n ref: createState(initialState)\r\n }));\r\n\r\n useEffect(() => ref.cancel, []);\r\n\r\n ref.stream = stream;\r\n\r\n return [\r\n ref.state,\r\n useMemo(\r\n () =>\r\n ref.send(() => {\r\n setValue({ ref });\r\n }),\r\n vars\r\n )\r\n ];\r\n}\r\n\r\nfunction consumer(value, process, id, subscribe) {\r\n return Promise.resolve(value).then(value => {\r\n if (isFunction(value)) {\r\n return consumer(value(process.state), process, id, subscribe);\r\n }\r\n\r\n if (typeof value == \"object\" && isFunction(value.next)) {\r\n return promise(resolve => {\r\n function scan(generator) {\r\n Promise.resolve(\r\n generator.next(process.state)\r\n ).then(({ value, done }) =>\r\n consumer(value, process, id, subscribe).then(() =>\r\n done ? resolve(process.state) : scan(generator)\r\n )\r\n );\r\n }\r\n scan(value);\r\n });\r\n }\r\n return process.next(value, subscribe, id);\r\n });\r\n}\r\n\r\nfunction createState(state) {\r\n let currentID = 0;\r\n let process = { state, next, cancel, send };\r\n\r\n function next(value, subscribe, id) {\r\n if (id != currentID) return promiseIgnore;\r\n if (value != CONTINUE) {\r\n process.state = value;\r\n subscribe && subscribe(value);\r\n }\r\n return process.state;\r\n }\r\n function cancel() {\r\n currentID++;\r\n }\r\n function send(subscribe) {\r\n return consumer(process.stream, process, ++currentID, subscribe);\r\n }\r\n\r\n return process;\r\n}\r\n"],"names":[],"mappings":"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"}
\No newline at end of file