UNPKG

atomico

Version:

Atomico is a small library for the creation of interfaces based on web-components, only using functions and hooks.

88 lines (72 loc) 2.45 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var constants = require('./chunk/constants.js'); var utils = require('./chunk/utils.js'); var core = require('./core.js'); const promiseIgnore = utils.promise(() => {}); const CONTINUE = Symbol(); function delay(ms) { return utils.promise(resolve => setTimeout(() => resolve(CONTINUE), ms)); } function useStateGenerator(stream, initialState, vars = constants.ARRAY_EMPTY) { let [{ ref }, setValue] = core.useState(() => ({ ref: createState(initialState) })); core.useEffect(() => ref.cancel, []); ref.stream = stream; return [ ref.state, core.useMemo( () => ref.send(() => { setValue({ ref }); }), vars ) ]; } function consumer(value, process, id, subscribe) { return Promise.resolve(value).then(value => { if (utils.isFunction(value)) { return consumer(value(process.state), process, id, subscribe); } if (typeof value == "object" && utils.isFunction(value.next)) { return utils.promise(resolve => { function scan(generator) { Promise.resolve( generator.next(process.state) ).then(({ value, done }) => consumer(value, process, id, subscribe).then(() => done ? resolve(process.state) : scan(generator) ) ); } scan(value); }); } return process.next(value, subscribe, id); }); } function createState(state) { let currentID = 0; let process = { state, next, cancel, send }; function next(value, subscribe, id) { if (id != currentID) return promiseIgnore; if (value != CONTINUE) { process.state = value; subscribe && subscribe(value); } return process.state; } function cancel() { currentID++; } function send(subscribe) { return consumer(process.stream, process, ++currentID, subscribe); } return process; } exports.CONTINUE = CONTINUE; exports.delay = delay; exports.useStateGenerator = useStateGenerator; //# sourceMappingURL=use-state-generator.js.map