Hello everybody,
I created an elevator to navigate a monad transformer stack, liberating us from creating a Monad* class and instances.
The key function, elevate, can be whatever you need:
elevate :: IO a -> IO a
elevate :: IO a -> StateT s IO a
elevate :: State s a -> StateT s IO a
elevate :: IO a -> MaybeT (StateT s IO) a
If you want to elevate actions above your monad, just write
instance Tower YourMonad
to declare that YourMonad is one-storied.
Cheers
Fumiaki Kinoshita