Actually, you can use `StateT` to do this, too:

    import Control.Monad.Trans.State.Strict
    import qualified Data.Sequence as S
    import Data.Sequence (ViewR(EmptyR, (:>)), (<|))
    import Pipes

    foo :: Monad m => Pipe Int (Maybe Int, Int) m r
    foo = flip evalStateT (S.replicate 3 Nothing) loop
      where
        loop = do
            s <- get
            n <- lift await
            let (mn, s') = case S.viewr s of
                    EmptyR   -> (Nothing, s )
                    s' :> mn -> (mn     , s')
            lift $ yield (mn, n)
            put (Just n <| s')
            loop

On 3/11/2014 11:11 PM, Daniel Mlot wrote:
That feels much more natural, thank you. (The pre-Pipes implementation of my algorithm did use a queue similar to that, except that I squashed it into the StateT layer. I like libraries which encourage good style.)

    but now you no longer have to batch steps N at a time and you can
    instead emit all elements immediately.


I was going to ask whether the batching had any observable effects (other than turning my code into muck), but then I noticed that it would be very annoying to e.g. conditionally interrupt the streaming in the middle of a batch...
--
You received this message because you are subscribed to the Google Groups "Haskell Pipes" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected] <mailto:[email protected]>. To post to this group, send email to [email protected] <mailto:[email protected]>.

--
You received this message because you are subscribed to the Google Groups "Haskell 
Pipes" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].

Reply via email to