User:Davjam2:Example/Solutions/StateMonad

From Wikibooks, open books for an open world
Jump to navigation Jump to search

Handling Combined States[edit | edit source]

1.

randomTurnS :: State (StdGen, TurnstileState) TurnstileOutput
randomTurnS = do
  (g,t) <- get
  let (i,g') = runState randomInputS g
      (o,t') = runState (turnS i) t
  put (g',t')
  return o

State-Processing a Subcomponent[edit | edit source]

1.

processingSnd :: State b o -> State (a,b) o
processingSnd m = do
  (s1,s2) <- get
  let (o,s2') = runState m s2
  put (s1,s2')
  return o

2.

randomTurnS :: State (StdGen, TurnstileState) TurnstileOutput
randomTurnS = do
  i <- processingFst randomInputS
  processingSnd $ turnS i

Generic Subcomponent Processing[edit | edit source]

1.

processing :: Lens cmb sub -> State sub o -> State cmb o
processing l m = do
  cmb <- get
  let sub = view l cmb
      (o,sub') = runState m sub
      cmb' = set l cmb sub'
  put cmb'
  return o

2.

randomTurnS :: State (StdGen, TurnstileState) TurnstileOutput
randomTurnS = do
  i <- processing fstL randomInputS
  processing sndL $ turnS i