Skip to content

NoTests/RxFeedback.js

Repository files navigation

Travis CI npm version

RxFeedback

TypeScript/JavaScript version of RxFeedback

20min video pitch

The simplest architecture for RxJS

    type FeedbackLoop<State, Event> = 
        (state: rx.Observable<State>, scheduler: IScheduler) => rx.Observable<Event>;

    declare module 'rxjs/Observable' {
        namespace Observable {
            function system<State, Event>(
                initialState: State,
                reduce: (state: State, event: Event) => State,
                feedback: FeedbackLoop<State, Event>[],
            ): Observable<State>;
        }
    }

Why

  • Straightforward

    • If it did happen -> Event
    • If it should happen -> Request
    • To fulfill Request -> Feedback loo
  • Declarative

    • System behavior is first declaratively specified and effects begin after subscribe is called => Compile time proof there are no "unhandled states"
  • Debugging is easier

    • A lot of logic is just normal pure function that can be debugged using Xcode debugger, or just printing the commands.
  • Can be applied on any level

    • Entire system
    • application (state is stored inside a database, CoreData, Firebase, Realm)
    • view controller (state is stored inside system operator)
    • inside feedback loop (another system operator inside feedback loop)
  • Works awesome with dependency injection

  • Testing

    • Reducer is a pure function, just call it and assert results
    • In case effects are being tested -> TestScheduler
  • Can model circular dependencies

  • Completely separates business logic from effects (Rx).

    • Business logic can be transpiled between platforms

Installing with NPM

$ npm install rxfeedback
import * as RxFeedback from 'rxfeedback';