module Ros.Topic.Transformers where
import Control.Arrow
import qualified Control.Monad.State.Lazy as L
import qualified Control.Monad.State.Strict as S
import Control.Monad.Reader
import Ros.Topic
runTopicState :: Monad m => Topic (L.StateT s m) a -> s -> Topic m a
runTopicState t s = Topic $ do ((x,t'), s') <- L.runStateT (runTopic t) s
return (x, runTopicState t' s')
runTopicState' :: Monad m => Topic (S.StateT s m) a -> s -> Topic m a
runTopicState' t s = Topic $ do ((x,t'), s') <- S.runStateT (runTopic t) s
return (x, runTopicState' t' s')
runTopicReader :: (Functor m, Monad m) => Topic (ReaderT r m) a -> r -> Topic m a
runTopicReader t r = go t
where go (Topic ma) = Topic $ second go `fmap` runReaderT ma r
liftMap :: (MonadTrans t, Monad m, Monad (t m)) =>
(a -> t m b) -> Topic m a -> Topic (t m) b
liftMap f = go
where go (Topic ma) = Topic $ do (x,t') <- lift ma
x' <- f x
return (x', go t')