module Pipes.Misc.State.Lazy where
import Control.Concurrent.STM
import Control.Lens
import Control.Monad.Morph
import Control.Monad.Reader
import Control.Monad.State.Lazy
import qualified Pipes as P
import qualified Pipes.Concurrent as PC
import qualified Pipes.Misc.Concurrent as PM
import qualified Pipes.Prelude as PP
store :: MonadState s m => Getter a b -> Setter' s b -> P.Pipe a a m r
store v s = forever $ do
a <- P.await
s .= view v a
P.yield a
retrieve :: MonadState s m => Getter s b -> P.Pipe a (b, a) m r
retrieve v = forever $ do
a <- P.await
s <- get
P.yield (view v s, a)
retrieve' :: MonadState s m => Getter s b -> P.Pipe () b m r
retrieve' v = forever $ do
P.await
s <- get
P.yield (view v s)
onState :: (MonadState s m) => (s -> m ()) -> P.Pipe a a m r
onState f = PP.mapM $ \a -> do
s <- get
f s
pure a
rsPipe :: (Monad m, MonadTrans t, MonadState s (t m)) => ReaderT a (StateT s m) b -> P.Pipe a b (t m) r
rsPipe m = forever $ do
a <- P.await
s <- get
~(c, s') <- lift . lift $ runStateT (runReaderT m a) s
put s'
P.yield c
rsProducer ::
(MonadState s (t STM), MonadTrans t) =>
PC.Input a -> ReaderT a (StateT s STM) c -> P.Producer' c (t STM) ()
rsProducer input m = hoist lift (PM.fromInputSTM input) P.>-> rsPipe m