I have a situation which I found easy to solve with `conduit` but could not 
figure out with `pipes`.

-- | Given a stream of key/value pairs, fold all the values associated with 
a
-- key in to a single value. Assumes that the stream has already been
-- sorted/grouped by key.
foldValues :: forall m k v. (Monad m, Eq k) => (v -> v -> v) -> Conduit (k, 
v) m (k, v)
foldValues step = goM =$= C.catMaybes
  where
    goM :: Conduit (k, v) m (Maybe (k, v))
    goM = do
        s <- C.mapAccum go Nothing
        case s of
          Nothing     -> yield Nothing
          Just (k, x) -> yield (Just (k, x))

    go :: (k, v) -> Maybe (k, v) -> (Maybe (k, v), Maybe (k, v))
    go (k, v) (Nothing)                  = (Just (k, v),        Nothing)
    go (k, v) (Just (k0, x)) | k == k0   = (Just (k, step x v), Nothing)
                             | otherwise = (Just (k, v),        Just (k0, 
x))


It seems to be related to the fact that with `pipes` I cannot observe that 
the stream has stopped emitting values. I had a quick look at `pipes-parse` 
and it seems like maybe that would help?

-- 
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 haskell-pipes+unsubscr...@googlegroups.com.
To post to this group, send email to haskell-pipes@googlegroups.com.

Reply via email to