0.0.4 • Published 5 years ago

genstate v0.0.4

Weekly downloads
3
License
ISC
Repository
github
Last release
5 years ago

genstate

Consume promises and generators to create a state with a highly declarative asynchrony. eg:

import { State } from "genstate";

let initialState = {};

State(initialState);

State.map = async function*(state, search) {
    yield {loading : true,search}

    let response = async fetch(`?search=${search}`);

    if(response.status != 200) return {error: true,search};

    return {
        search,
        data : await response.json(),
    }
};

State.send("any...", state => {
	console.log(state);
});

Special effects

Return of new generators

the host generator, can return other gestant generators, consumes the returns recursively.

Opening concurrent status

for a correct update of the concurrent state in the asynchronous process you must return a function this will concur the concurrent state.

async function* map(state, data) {
	yield state => state + 1;
	yield state => state + 1;
	yield state => state + 1;
	return state => state + 1;
}

Return constants

return constants allow changing state behavior.

CLEAR

this constant will ignore all the executions already declared, to focus only on the one that declares it is constant, by means of this constant, you can make the asynchrony have a cancelable effect optimizing the concurrence.

import { CLEAR } from "genstate";

async function* map(state, data) {
	yield CLEAR;
	yield 1;
	await delay(1000);
	yield 2;
	await delay(1000);
	return 3;
}

BREAK

allows you to ignore asynchronous execution.

CONTINUE

since genstate will read the returns of the promise to define a next state, if you force your promise to return the constant CONTINUE, it will wait for the promise but not associate the return of this as a state.

hooks

import useGenerator from "genstate/atomico";

function WebComponent() {
	let [state, send] = useGenerator(async *(state,search)=>{
        yield {loading : true,search}

        let response = async fetch(`?search=${search}`);

        if(response.status != 200) return {error: true,search};

        return {
            search,
            data : await response.json(),
        }
    });
}
0.0.4

5 years ago

0.0.3

5 years ago

0.0.2

5 years ago

0.0.0

5 years ago