Skip to content

Instantly share code, notes, and snippets.

View ShMcK's full-sized avatar

Shawn McKay ShMcK

View GitHub Profile
@ShMcK
ShMcK / state-as-context.js
Last active July 23, 2018 14:45
State as Context
import { State, withStatechart } from 'react-automata'
import alarmMachine from './alarmMachine'
const AlarmClock = () => (
<>
<State value='Ringing'>
<Clock ringing />
</State>
<State value=['Idle', 'Snoozing']>
<Clock />
@ShMcK
ShMcK / state-as-prop.js
Created July 20, 2018 03:17
stateAsProp
import { withStatechart } from 'react-automata'
import alarmMachine from './alarmMachine'
const AlarmClock = ({ machineState }) => (
<Clock ringing={machineState.value === 'Ringing'}/>
)
export default withStatechart(alarmMachine)(AlarmClock)
@ShMcK
ShMcK / react-automata-withStatechart.js
Created July 20, 2018 03:14
react-automata-withStatechart
import { withStatechart } from 'react-automata'
import alarmMachine from './alarmMachine'
import AlarmClock from './components/AlarmClock'
export default withStatechart(alarmMachine)(AlarmClock)
@ShMcK
ShMcK / xstate-stateless.js
Created July 20, 2018 03:06
stateless xstate
let currentState = 'Idle'
const nextState = alarmMachine
.transition(currentState, 'ALARM_TRIGGERED')
nextState.value // 'Ringing'
nextState.actions // ['ring']
nextState.events // ['SNOOZE', 'CANCEL']
@ShMcK
ShMcK / xstate-example.js
Last active July 22, 2018 15:27
xstate example
import { Machine } from 'xstate'
const Alarm = {
Alarm: {
initial: 'Ringing',
on: { CANCEL: 'Idle' },
states: {
Ringing: {
on: { SNOOZE: 'Snoozing' },
onEntry: ['startRing'],
onExit: ['stopRing'],
@ShMcK
ShMcK / states.js
Created July 17, 2018 02:50
State Machine with external actions
type Props = {
load(): void,
}
type States = {
mode: 'loading' | 'loaded' | 'errors',
data: any,
}
const actions = {
@ShMcK
ShMcK / FiniteStates.js
Created July 7, 2018 21:50
FiniteStatesSimplification
const events = {
STOP: 'Stopped',
PLAY: 'Playing'
}
@ShMcK
ShMcK / WalkmanStateMachineGuard2.jsx
Last active July 17, 2018 03:02
VisualizingState: Walkman State Machine Guard 2
class Walkman extends React.Component {
 transition = (event) => {
  const preventTapeJam = /* ... */
  const shouldEject = event === 'STOP' && this.state.current === 'Stopped'
 
  if (!preventTapeJam) {
  /* … */
  } else if (shouldEject) {
  this.setState({ current: events.EJECT })
  }
@ShMcK
ShMcK / WalkmanStateMachineGuard.jsx
Last active July 18, 2018 02:12
Visualizing State: Walkman State Machine Guard
 const events = {
  STOP: 'Stopped',
  PLAY: 'Playing',
  REWIND: 'Rewinding',
  FASTFORWARD: 'FastForwarding',
 }
class Walkman extends React.Component {
 transition = (target) => {
  const preventTapeJam =
@ShMcK
ShMcK / WalkmanStateMachineComplex.jsx
Last active July 17, 2018 02:54
VisualizingState: Walkman State Machine + Complexity
const events = {
  STOP: 'Stopped',
  PLAY: 'Playing',
  REWIND: 'Rewinding',
  FASTFORWARD: 'FastForwarding',
 }
class Walkman extends React.Component {
 state = {
  current: events.STOP,