Giter VIP home page Giter VIP logo

sidekick's Introduction

Sidekick

New concept for redux like store.

Difference from redux and sagas

  • No reducers
  • No return action at async flow
  • No separation for sync & async actions
  • Transaction state change supported by immer
  • Update state in the middle of async action

Why

State update often break async action flow, because you need return action - update state reducer - return to async action. To make this operation in one transaction there's new conception - scenario.

It's async action supported by most.

In general case it's a function that accept 2 things:

  • Async stream - source
  • Object state with current state and function to update state - {getState, setState}

Scenario must return stream to run it with runEffects

Source used as basic async primitive. Thanks to most - every situation will be handled in composable way.

State - always contains up to date state and setState function. It works because of reference passing, that's why DON'T DESCTRUCTURE STATE

export type Scenario<S, A> = (
  props: {
    state: {
      getState: GetState<S>;
      setState: SetState<S>;
    };
    source: Stream<StreamStateAction<S, A>>;
  }
) => Stream<unknown>;

Here's a scenario example that toggles state and react to ToggleAction:

const toggler: Scenario<State, ToggleAction> = ({ source, state }) => {
  return tap(({ action }) => {
    const newValue = action.value;
    state.setState({ value: newValue });
  }, source);
};

Other part - DispatchProvider. This react component provides dispatch and getState function. Under hood it optimize useState to prevent double subscription and memory leak.

<DispatchProvider actions={[toggler]} initialState={() => ({ value: false })}>
  {(dispatch, getState) => {}}
</DispatchProvider>

Install & run

yarn start

sidekick's People

Contributors

aetet avatar dependabot[bot] avatar

Stargazers

Roman avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.