Skip to content

Instantly share code, notes, and snippets.

View mweststrate's full-sized avatar
💭
I may be slow to respond.

Michel Weststrate mweststrate

💭
I may be slow to respond.
View GitHub Profile
@mweststrate
mweststrate / immer-curry.js
Last active January 12, 2018 08:04
immer producer with currying
const byId = produce((draft, action) => {
switch (action.type) {
case RECEIVE_PRODUCTS:
action.products.forEach(product => {
draft[product.id] = product
})
break
}
})
@mweststrate
mweststrate / update-in.js
Created January 9, 2018 10:57
update-in
// ImmutableJS
const newMap = map.updateIn(['inMap', 'inList'], list => list.push(4))
// Immer
draft.inMap.inList.push(4)
@mweststrate
mweststrate / immer.js
Last active November 28, 2019 14:59
immer-producer-4
const byId = (state, action) =>
produce(state, draft => {
switch (action.type) {
case RECEIVE_PRODUCTS:
action.products.forEach(product => {
draft[product.id] = product
})
break
}
})
@mweststrate
mweststrate / redux.js
Created January 9, 2018 08:28
immer-producer-3
// Shortened, based on: https://github.com/reactjs/redux/blob/master/examples/shopping-cart/src/reducers/products.js
const byId = (state, action) => {
switch (action.type) {
case RECEIVE_PRODUCTS:
return {
...state,
...action.products.reduce((obj, product) => {
obj[product.id] = product
return obj
}, {})
@mweststrate
mweststrate / producer.js
Created January 9, 2018 08:19
immer-producer-2
import produce from "immer"
const todos = [ /* 2 todo objects in here */ ]
const nextTodos = produce(todos, draft => {
draft.push({ text: "learn immer", done: true })
draft[1].done = true
})
// old state is unmodified
@mweststrate
mweststrate / producer.js
Created January 9, 2018 08:09
immer-producer-1
import produce from "immer"
const nextState = produce(currentState, draft => {
// empty function
})
console.log(nextState === currentState) // true
@mweststrate
mweststrate / middleware.js
Last active September 25, 2017 15:07
Patch based middleware for atomic actions
import { recordPatches } from "mobx-state-tree"
const runningActions = new Map()
export function atomicAsyncPatch(call, next) {
switch (call.type) {
case "action":
return atomic(call, next)
case "process_spawn": {
const recorder = recordPatches(call.tree)
import { getSnapshot } from 'mobx-state-tree'
const task1 = Todo.create({ title: "Try MST!" })
task1.toggle()
console.dir(getSnapshot(task1))
// prints { title: "Try MST!" , finished: true }
import { types } from 'mobx-state-tree'
export const Todo = types.model(
'Todo',
{
title: types.string,
finished: false,
},
{
toggle() {
@mweststrate
mweststrate / tracked-mobx.js
Created March 30, 2017 06:32
tracked-mobx.js
/**
Shitty implementation of tracked compatible local component state library powered by MobX
Demo: https://jsfiddle.net/mweststrate/Ltmhe3rh/
@example
class Example extends Component {
// initialize state.count with a value:
@tracked count = 1000;