prev (18) slide 19 / 33 next (20)
StateT, UiStateMonad
type StateStack m = State.StateT State
(Logger.LoggerT Update.Update
(Error.ErrorT StateError m))
newtype StateT m a = StateT (StateStack m a)
deriving (Functor, Monad, Trans.MonadIO, Error.MonadError StateError)
instance Trans.MonadTrans StateT where
lift = StateT . lift . lift . lift
-- | Abort is used by Cmd, so don't throw it from here. This isn't exactly
-- modular, but ErrorT can't be composed and extensible exceptions are too
-- much bother at the moment.
data StateError = StateError String | Abort deriving (Generics.Typeable)
-- TODO remove modify and implement in terms of get and put?
-- TODO I also think I can remove throw since it's in Error
class (Monad m, Functor m) => UiStateMonad m where
get :: m State
put :: State → m ()
modify :: (State → State) → m ()
update :: Update.Update → m ()
throw :: String → m a
instance Monad m => UiStateMonad (StateT m) where
...
prev (18) slide 19 / 33 next (20)