TypeScript/JavaScript version of RxFeedback
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>;
}
}
-
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';