Skip to content

Instantly share code, notes, and snippets.

View bradfordlemley's full-sized avatar

Bradford Lemley bradfordlemley

View GitHub Profile
@bradfordlemley
bradfordlemley / state.js
Created May 30, 2019 14:32
Library-to-Library Interactions with Reactive Programming
import { from } from 'rxjs';
import { distinctUntilKeyChanged } from 'rxjs/operators';
const todoLib = createTodoLib();
const authLib = createAuthLib();
from(todoLib.state$).pipe(
distinctUntilKeyChanged('authFailed'),
filter(state => state.authFailed),
).subscribe(
@bradfordlemley
bradfordlemley / state.js
Created May 30, 2019 14:30
Library-to-Library Interactions
const todoLib = createTodoLib();
const authLib = createAuthLib();
authLib.state$.subscribe(state => {
todoLib.setUser(state.user);
});
todoLib.state$.subscribe(state => {
if (state.authFailed) {
authLib.refresh();
@bradfordlemley
bradfordlemley / App.jsx
Created May 29, 2019 22:54
Functional App component using "use"
import { use } from '@stated-library/react';
import { appState$ } from './state';
const App = () => {
const {addTodo, allTodos, visibleTodos} = use(appState$);
return (
<>
@bradfordlemley
bradfordlemley / state.js
Created May 29, 2019 22:17
Simple mapState example
import { mapState } from '@stated-library/core';
const todoLib = createTodoLib();
const appState$ = mapState(
todoLib.state$,
state => ({
addTodo: todoLib.addTodo,
allTodos: state.todos,
isFetchingTodos: state.isFetching,
@bradfordlemley
bradfordlemley / state.test.js
Created May 29, 2019 22:13
Testing state composition
// reset state module for each test
let state;
beforeEach(() => {
jest.resetModules();
state = require('./state');
})
test('visibleTodos$ contains todos filtered thru visibilityFilter', () => {
const { todoLib, visibleTodos$ } = state;
todoLib.addTodo("First");
@bradfordlemley
bradfordlemley / state.js
Last active May 29, 2019 22:21
Advanced composed state
import { mapState } from '@stated-library/core';
const todoLib = createTodoLib();
const counterLib = createCounterLib();
const visLib = createVisibilityLib();
const visibleTodos$ = mapState(
[todoLib.state$, visLib.state$],
([todoLibState, visLibState]) => {
switch (visLibState.filter) {
@bradfordlemley
bradfordlemley / TodoLib.js
Last active May 29, 2019 20:52
Todo library with derived state
import { createSelector } from 'reselect';
import createBase from './StatedLibBase';
export default function createTodoLib() {
const getCompletedTodos = createSelector(
state => state.todos,
todos => todos.filter(todo => todo.completed),
);
@bradfordlemley
bradfordlemley / StatedLibBase.js
Last active May 29, 2019 20:54
Stated Lib Base with deriveState
export default function createBase(initialState, deriveState){
let state = deriveState ? deriveState(initialState) : initialState;
let state$ = new Observable();
function setState(newState) {
state = deriveState ? deriveState(newState) : newState;
state$.next(state);
}
function updateState(update) {
@bradfordlemley
bradfordlemley / TodoLib.js
Last active May 24, 2019 20:32
Todo library using stated library base
import createBase from './StatedLibBase';
export default function createTodoLib() {
const base = createBase({ todos: [], isFetching: false });
const {updateState, state$} = base;
return {
get state: {return base.state},
state$,
@bradfordlemley
bradfordlemley / Counter.js
Last active May 24, 2019 17:32
Counter using base stated library
import createBase from './StatedLibBase';
export default function createCounter() {
let base = createBase(0);
return {
get state() { return base.state },
state$: base.state$,