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)