Skip to content
This repository has been archived by the owner on Jun 8, 2019. It is now read-only.

KoharaKazuya/joqt

Repository files navigation

Joqt

Joqt is a centerized Flux Store

const { createStore } = require('joqt');

(async () => {
  const store = await createStore([
    {
      type: 'ADD_TODO',
      paths: ['todos'],
      reducer: ({ todos = [] }, message) => ({ todos: todos.concat([message]) })
    },
    {
      type: 'CLEAR_TODOS',
      paths: ['todos'],
      reducer: async function*({ todos = [] }) {
        while (true) {
          await new Promise(r => setTimeout(r, 1000));
          todos.shift();
          if (todos.length === 0) break;
          yield { todos };
        }
        return { todos };
      }
    }
  ]);

  store.subscribe(() => console.log(store.getState()));

  store.dispatch({ type: 'ADD_TODO', payload: 'do!' });
})();

Joqt store reduces prev state and action to next state, whenever action dispatched. We can control state predictably like Redux.

Joqt reducer can be a function, async function, generator function or async generator function. We can control asynchronous control flow like Redux-Saga.

To prevent from break state by race condition, Joqt needs paths with reducer that are part of state tree and that reducer receives as argument. Joqt serializes executions of reducers when reducers have overlapping state tree.

Installation

$ npm install --save joqt

License

MIT