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 / 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)
@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 / 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 / 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 / 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-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 / cityview.js
Created March 6, 2018 14:43
CityView component
const CityView = observer(({ city }) => (
<li>
City: {city.location} - Temperature in ℃: {city.temperature || 'Loading'}
</li>
))
@mweststrate
mweststrate / when.js
Created March 6, 2018 14:59
Async when
import { when } from "mobx"
async() => {
await when(() => user.loggedOut)
alert("You have been successfully logged out!")
}
@mweststrate
mweststrate / doc structure proposal.md
Created March 11, 2018 10:36
doc structure proposal.md
  • philosophy
  • overview
    • observables
    • reactions: autorun
    • derived values: computed
    • actions

Making things observable

  • observable.box
  • observable.object
@mweststrate
mweststrate / decorators.js
Last active March 12, 2018 19:46
Decorators in MobX
import { decorate, observable, flow } from "mobx"
/**
with decorator syntax enabled
*/
class City {
@observable location
@observable temperature
@action.bound