All Projects → kitten → Fluorine

kitten / Fluorine

Licence: cc0-1.0
[UNMAINTAINED] Reactive state and side effect management for React using a single stream of actions

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to Fluorine

vuex-but-for-react
A state management library for React, heavily inspired by vuex
Stars: ✭ 96 (-66.55%)
Mutual labels:  flux, state-management
ngx-model-hacker-news-example
Example repository with Hacker News implementation using Angular, Angular Material & ngx-model
Stars: ✭ 27 (-90.59%)
Mutual labels:  rxjs, state-management
RxReduxK
Micro-framework for Redux implemented in Kotlin
Stars: ✭ 65 (-77.35%)
Mutual labels:  flux, state-management
flow-state
UI state management with RxJS.
Stars: ✭ 33 (-88.5%)
Mutual labels:  rxjs, state-management
Verge
🟣 Verge is a very tunable state-management engine on iOS App (UIKit / SwiftUI) and built-in ORM.
Stars: ✭ 273 (-4.88%)
Mutual labels:  dispatcher, flux
react-evoke
Straightforward action-driven state management for straightforward apps built with Suspense
Stars: ✭ 15 (-94.77%)
Mutual labels:  flux, state-management
rxdeep
rxjs deep state management
Stars: ✭ 47 (-83.62%)
Mutual labels:  rxjs, state-management
temperjs
State management for React, made simple.
Stars: ✭ 15 (-94.77%)
Mutual labels:  flux, state-management
Loona
🌕 Application State Management done with GraphQL
Stars: ✭ 270 (-5.92%)
Mutual labels:  flux, state-management
reactive-store
A store implementation for state management with RxJS
Stars: ✭ 29 (-89.9%)
Mutual labels:  rxjs, state-management
mutable
State containers with dirty checking and more
Stars: ✭ 32 (-88.85%)
Mutual labels:  flux, state-management
mini-kotlin
Minimal Flux architecture written in Kotlin.
Stars: ✭ 20 (-93.03%)
Mutual labels:  flux, state-management
lamp-luwak
Service-oriented state management for React
Stars: ✭ 12 (-95.82%)
Mutual labels:  state-management, dispatcher
aurelia-hoc-store
An Aurelia application showing the use of higher order components and a single state approach.
Stars: ✭ 20 (-93.03%)
Mutual labels:  rxjs, state-management
space-state
Demo app for Subjecting State to Good Behavior
Stars: ✭ 46 (-83.97%)
Mutual labels:  rxjs, state-management
juliette
Reactive State Management Powered by RxJS
Stars: ✭ 84 (-70.73%)
Mutual labels:  rxjs, state-management
ngx-mobx
Mobx decorators for Angular Applications
Stars: ✭ 14 (-95.12%)
Mutual labels:  rxjs, state-management
flux-redux
An application implementing Flux and Redux with few other dependencies
Stars: ✭ 24 (-91.64%)
Mutual labels:  flux, dispatcher
Vuex-Alt
An alternative approach to Vuex helpers for accessing state, getters and actions that doesn't rely on string constants.
Stars: ✭ 15 (-94.77%)
Mutual labels:  flux, state-management
litestate
An ambitiously tiny, gizp ~800b, flux-like library to manage your state
Stars: ✭ 31 (-89.2%)
Mutual labels:  flux, state-management

Flexible state and side effect manager using RxJS for React.

Join Fluorine's Slack!

About

Fluorine provides you with easy, reactive state and side effect management, accumulating stores from streams of actions and side effects.

It builds on the ideas of Redux, while preserving a Flux-like Dispatcher as the single source of truth.

  • Your stores are directly reduced from the dispatcher and actions are dispatched on it
  • Manage your side effect as Observables ("Agendas") with automatic rollbacks on error
  • Unopinionated and simple API with Middleware support

This is the ultimate way to use RxJS for state and side effect management!

Documentation

Quick Intro

This is just a short example that quickly presents all features of the Dispatcher. It is of course not representetive for how to use it in real React projects.

import { createDispatcher } from 'fluorine-lib'
import thunk from 'fluorine-lib/lib/middleware/thunk'

/**
 * This is a reducer, a pure function with (state, action) => state signature.
 * It describes how an action transforms the state into the next state.
 *
 * The shape of the state is up to you: it can be a primitive, an array, an object,
 * or even an Immutable.js data structure. The only important part is that you should
 * not mutate the state object, but return a new object if the state changes.
 *
 * In this example, we use a `switch` statement and strings, but you can use a helper that
 * follows a different convention (such as function maps) if it makes sense for your project.
 */
function counter(state = 0, action) {
  switch (action.type) {
  case 'INCREMENT':
    return state + 1
  case 'DECREMENT':
    return state - 1
  default:
    return state
  }
}

// Create a dispatcher which is our event stream
const dispatcher = createDispatcher({ logging: true }, [ thunk ])

// This reduces the dispatcher event stream to a store. This is essentially an
// RxJS Observable that emits the state of the store over time
const store = dispatcher.reduce(counter)

store.subscribe(x => {
  console.log(x) // Your store's state
})

// Dispatch an action, a thunk, or a promise

dispatcher.next({ type: 'INCREMENT' })

dispatcher.next(next => {
  next({ type: 'DECREMENT' })
})

dispatcher.next(new Promise((resolve, reject) => {
  resolve({ type: 'INCREMENT' })
}))

// Agendas: Schedule a task, represented by an observable that emits actions
// If the observable fails, then all its changes are reverted

const addIfFetchSucceeds = Observable
  .of({ type: 'ADD' })
  .concat(Observable
    .of('/ping')
    .flatMap(path => Observable.fromPromise(fetch(path))))

dispatcher.next(addIfFetchSucceeds)

Just as in Flux we've got stores, actions and a dispatcher. The seperation of concern is intact, while the dispatcher exclusively is the single source of truth.

Compared to Redux we've got fully functional actions and stores as well, but the state is handled fully reactively using RxJS. We can even use all of RxJS's operators.

On top of that we've got a new way of handling side effects: Agendas. This enables you to schedule observables as streams of actions, which roll back all their changes if they fail. This makes it easy to design exceedingly complex side effects.

Fluorine-related Projects

Frequently Asked Questions

Why write another Flux library?

The goal of this project is to create a efficient but minimal library on top of RxJS that can preserve your previous (pure reducer) stores and actions, which you would write for a Redux project as well, but give you even more power over them.

Redux is building on top of the known strengths of Flux by mixing it with more functional ideas, but without a tool like RxJS it fails to combine the dispatcher and stores. Fluorine doesn't need containers for stores as every store can be reduced from the actions on the Dispatcher reactively.

On top of that Fluorine provides a new way to manage side effects, which is much more powerful than plain thunks.

Why the name?

Fluorine is (chemically-speaking) the most reactive non-metal. As Fluorine embraces RxJS to bring even more advantages of reactive programming to React, it is a fitting name.

Furthermore the latin verb fluo means "flow", which is a direct refernce to Flux and its unidirectional data-flow.

Used and Supported by

DataWallet

Thanks to

  • The ReactiveX team, all the RxJS developers and the ReactiveX community
  • Dan Abramov for Redux that is a big influence to Fluorine
  • The React team
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].